从Java添加属性到Groovy对象
发布时间:2020-12-15 04:08:25 所属栏目:Java 来源:网络整理
导读:我希望能够使用来自 Java的Groovy的元编程功能向String对象的实例添加属性. 要从Groovy执行此操作很简单: class GroovyClass { def getDynamicString() { def myString = "hello" myString.metaClass.dynamicProperty = "there" return myString }} 这是我
我希望能够使用来自
Java的Groovy的元编程功能向String对象的实例添加属性.
要从Groovy执行此操作很简单: 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将额外的属性和方法(如getMetaClass)添加到像String这样的JDK类中,但我不确定它是如何以及何时执行此操作的.我发现以下解决方案有效,但初始化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库方法? 解决方法
所以,鉴于这个groovy脚本:
def a = 'A String' Decorator.decorate( a,'foo','bar' ) assert a == 'A String' assert a.class == String assert a.foo == 'bar' 然后我们可以像这样编写java Decorator类: import org.codehaus.groovy.runtime.HandleMetaClass ; import org.codehaus.groovy.runtime.InvokerHelper ; public class Decorator { public static void decorate( Object o,String name,Object value ) { HandleMetaClass hmc = new HandleMetaClass( InvokerHelper.getMetaClass( o ),o ) ; hmc.setProperty( name,value ) ; } } 然后,如果我们编译java类,并运行groovy脚本,所有断言都应该通过 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |