【发布时间】:2018-06-21 17:54:52
【问题描述】:
我正在尝试在 Groovy 中动态生成类。我的做法是这样的:
class MetaClassTest {
static class TestClass {
String getName() {
return "Jake"
}
}
public static void main(String[] args) {
def testClass = TestClass
def metaMethod = testClass.metaClass.getMetaMethod('getName', [] as Class[])
testClass.metaClass.getName = {
metaMethod.invoke(delegate) + " and the Fatman"
}
assert testClass.newInstance().name == "Jake and the Fatman"
}
}
然而,这改变了我不想要的原始类的行为。所以我的问题是:
如何动态克隆(并且可能重命名)现有类,以便能够创建多个派生类?
【问题讨论】:
-
所以也许这应该是通常的
extends?class MyTestClass extends TestClass... -
或使用@Delegate:
class MyTextClass{ @Delegate TestClass delegate; } -
这不是动态代码(如果没有在运行时通过
GroovyClassLoader进行评估,这也是一个选项,但不是很好)。 -
也许你应该扩展你的问题?因为您的代码示例也不是真正动态的......究竟应该是动态的?
-
动态生成类 - 最简单的方法是使用
extends或@Delegate生成真实的类代码并将其解析/加载到类加载器中。
标签: java groovy reflection metaprogramming metaclass