我希望您能够利用Groovy的元编程能力,将属性添加到Java中的String对象实例中。为了在Groovy中完成此操作,非常简单:
然而,我想从Java中做同样的事情,并通过相同的测试运行它。据我所知,Groovy会向JDK类(如String)添加额外的属性和方法(例如getMetaClass),但我不确定它是如何或何时添加的。我发现以下解决方案可行,但初始化GroovyShell并将元编程代码编写为字符串似乎很繁琐。
class GroovyClass {
def getDynamicString() {
def myString = "hello"
myString.metaClass.dynamicProperty = "there"
return myString
}
}
以下是我的 Spock 测试用例:
def "should add dynamic property"() {
GroovyClass groovyClass = new GroovyClass()
when:
def theString = groovyClass.getDynamicString()
then:
theString == "hello"
theString.dynamicProperty == "there"
}
然而,我想从Java中做同样的事情,并通过相同的测试运行它。据我所知,Groovy会向JDK类(如String)添加额外的属性和方法(例如getMetaClass),但我不确定它是如何或何时添加的。我发现以下解决方案可行,但初始化GroovyShell并将元编程代码编写为字符串似乎很繁琐。
public String getDynamicString()
{
String myString = "hello";
GroovyShell shell = new GroovyShell();
shell.setVariable("myString", myString);
shell.setVariable("theDynamicPropertyValue", "there");
shell.evaluate("myString.metaClass.dynamicProperty = theDynamicPropertyValue");
return myString;
}
有没有一种方法可以不使用shell.evaluate,而是直接从Java中调用Groovy库方法来实现上述操作?