注意:我发现另一个答案表明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方法保持静态但我必须这样做,但是目前我甚至不相信我可以做到这一点 .