gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:44:17 25 4
gpt4 key购买 nike

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

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

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

这个类的父类有一个主要通过,反射(reflect)@Command 注释,如果方法名称与您的参数匹配,则执行它。

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

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

目前,我已经通过将子类的名称硬编码到父类的名称中来使其工作,如下所示:
public class QuickCli {
public static void main(String[] args} {
(new HardCodedChildClassName())."${args[0]}"()
}
}

我删减了很多,但这是总体思路。我想更换
"new HardCodedChildClassName()"

具有适用于扩展此类的任何类的东西。

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

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

最佳答案

我不确定这是否可能。无论如何,如果是的话,它很可能是一个丑陋的黑客。我建议使用这种替代方法:而不是使用静态 main()入口点,使 QuickCli Runnable . Groovy 会自动创建一个实例并调用 run()当它启动时。

这里的一个小问题是捕获命令行参数。 Groovy 通过将它们传递给带有 String[] 的构造函数来处理此问题。参数。实例化的类需要这个构造函数来捕获参数,但在 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()
}
}

关于reflection - 如何在 Groovy 的父静态方法中获取已定义类的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10888306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com