首页 文章

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

提问于
浏览
2

注意:我发现另一个答案表明Java会将静态方法调用重定向到它自己的类,即使它在子类上被调用,所以我想我需要找到一个Groovy解决方法,或者它不会是可行的 .

这是问题所在:我创建了一个带有“public static void main”的抽象通用“Launcher”类 . 这个想法是你扩展它,在你的子类中你注释这样的方法:

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

此类的父级有一个main,它反映了@Command注释,如果方法名称与您的参数匹配,则执行它 .

问题是我无法弄清楚如何判断实际的实例化类在父的静态main方法中是什么 .

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

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

public class QuickCli {
    public static void main(String[] args} {
        (new HardCodedChildClassName())."${args[0]}"()
    }
}

我从中减少了很多,但这是一般的想法 . 我想替换

"new HardCodedChildClassName()"

有一些东西适用于任何扩展此类的类 .

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

groovy HardCodedChildClassName dir

虽然我不想让所有的@Command方法保持静态但我必须这样做,但是目前我甚至不相信我可以做到这一点 .

1 回答

  • 3

    我'm not sure that'是可能的 . 在任何情况下,它都建议使用此替代方法:而不是使用静态 main() 入口点,使 QuickCli a Runnable . Groovy会在启动时自动创建一个实例并在其上调用 run() .

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

    这是一个如何看起来的例子:

    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()    
        }
    }
    

相关问题