Reflection 如何在Groovy的父静态方法中获取已定义类的名称

Reflection 如何在Groovy的父静态方法中获取已定义类的名称,reflection,groovy,static,Reflection,Groovy,Static,注意:我发现了另一个答案,即Java会将静态方法调用重定向到它自己的类,即使它是在子类上调用的,所以我想我需要找到Groovy的变通方法,否则它就行不通了 问题是:我创建了一个抽象的泛型“Launcher”类,其中包含一个“publicstaticvoidmain”。我们的想法是对其进行扩展,并在子类中对如下方法进行注释: @Command("Show an explorere shell") public dir() { "explorer".execute() } publ

注意:我发现了另一个答案,即Java会将静态方法调用重定向到它自己的类,即使它是在子类上调用的,所以我想我需要找到Groovy的变通方法,否则它就行不通了

问题是:我创建了一个抽象的泛型“Launcher”类,其中包含一个“publicstaticvoidmain”。我们的想法是对其进行扩展,并在子类中对如下方法进行注释:

@Command("Show an explorere shell")
public dir() {
    "explorer".execute()    
}
public class QuickCli {
    public static void main(String[] args} {
        (new HardCodedChildClassName())."${args[0]}"()
    }
}
该类的父类有一个main,该main遍历@Command注释,如果方法名与您的参数匹配,则执行它

问题是我不知道如何判断父级的静态main方法中实际实例化的类是什么

我很确定在某个地方有一个技巧--“this”在静态中不起作用,堆栈跟踪不包含实际的类,只包含父类,并且我在类或元类对象中找不到任何有帮助的元信息

目前,我已经通过将子类的名称硬编码到父类的main中来实现它,如下所示:

@Command("Show an explorere shell")
public dir() {
    "explorer".execute()    
}
public class QuickCli {
    public static void main(String[] args} {
        (new HardCodedChildClassName())."${args[0]}"()
    }
}
我删掉了很多,但这只是一般的想法。我想换一个

"new HardCodedChildClassName()"
具有适用于扩展该类的任何类的内容

鉴于上面的两个代码片段,该命令将从命令行执行,如下所示:

groovy HardCodedChildClassName dir

虽然我不希望所有@Command方法都是静态的,但如果必须的话,我可以这样做,但目前我甚至不相信我能做到这一点。

我不确定这是否可行。无论如何,如果是这样的话,它很可能是一个丑陋的黑客。我建议这样做:与其使用静态
main()
入口点,不如使用
QuickCli
a
Runnable
。Groovy将自动创建一个实例,并在启动时对其调用
run()

这里的一个小问题是捕获命令行参数。Groovy通过使用
String[]
参数将它们传递给构造函数来处理这个问题。实例化的类需要这个构造函数来捕获参数,但在Java中,构造函数不是继承的。幸运的是,Groovy有一个注释可以解决这个问题

下面是一个这样的例子:

class QuickCli implements Runnable {
    def args

    QuickCli(String[] args) {
        this.args = args
    }

    void run() {
        "${args[0]}"()
    }
}


@groovy.transform.InheritConstructors
class HardCodedChildClassName extends QuickCli {

    @Command("Show an explorere shell")
    public dir() {
        "explorer".execute()    
    }
}

静态方法在Java中不会被继承,唯一隐藏的是你所说的编辑注释?是的,因为静态方法不会被继承,我认为这在Java中是不可能的——我希望Groovy有一些技巧。目前我的解决方案是在我的子类中放置一个main,它将自身的一个实例转发给父启动器类,但我不希望这样做。事实上,这正是我所希望的基于groovy的解决方案,而且效果很好。如果它不需要那个注释就好了。。。我将研究Java/groovy可能隐藏它们的其他地方。我会把这个问题留待一段时间,给其他人一个机会,但我并不期待有比这个更好的解决方案。