我可以在Java对象中实现Groovy的getProperty吗? [英] Can I implement Groovy's getProperty in Java Objects
问题描述
我可以在Java对象中实现Groovy的getProperty吗?
我有一个混合的Java / Groovy项目,我正在尝试向我的Java对象添加一些糖使得Groovy侧面更加清晰。
是否可以在Java类中实现 Object getProperty(String)
在访问该实例的属性时Groovy会看到它吗?
我有一个失败的测试用例,如下所示:
// HasProperty.java
$ p $
public class HasProperty {
public Object getProperty(String name){
returnpie;
// TestHasProperty.groovy
类HasPropertyTest {
@ org.junit.Test
public void testCanGetProperty(){
def h = new HasProperty()
assert h.name ==pie
}
}
测试失败而没有夸奖:
groovy.lang.MissingPropertyException:No这样的属性:类的名称:HasProperty
在org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50)
在org.codehaus.groovy.runtime.callsite.GetEffectivePojoPropertySite.getProperty(
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:227)
at [...]
$ c $ GetEffectivePojoPropertySite.java:63)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty这是Groovy 1.8.6和Java 6。解决方案为了使这个工作不需要像@ tim_yates的答案一样实现GroovyObject,你可以包装obj与一个非常简单的groovy对象。例如:
类GroovyWrapper扩展了groovy.util.Proxy {
def包装
GroovyWrapper(obj) {
wrapped = obj
adaptee = obj
}
def getProperty(String name){
wrapped.getProperty()
}
}
$ b $ def h = new GroovyWrapper(new HasProperty())
assert h.name ==pie
Can I implement Groovy's getProperty in Java Objects
I have a mixed Java/Groovy project, and I'm trying to add some "sugar" to my Java objects to make the Groovy side cleaner.
Is it possible to implement
Object getProperty(String)
in a Java class and have Groovy see it when accessing properties on that instance?I have a failing test case as follows:
// HasProperty.java public class HasProperty { public Object getProperty(String name) { return "pie"; } } // TestHasProperty.groovy class HasPropertyTest { @org.junit.Test public void testCanGetProperty() { def h = new HasProperty() assert h.name == "pie" } }
The test fails without fanfare:
groovy.lang.MissingPropertyException: No such property: name for class: HasProperty at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50) at org.codehaus.groovy.runtime.callsite.GetEffectivePojoPropertySite.getProperty(GetEffectivePojoPropertySite.java:63) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:227) at [...]
This is Groovy 1.8.6 and Java 6.
解决方案To make this work without implementing GroovyObject as per @tim_yates's answer, you can wrap the object with a very simple groovy object. For example:
class GroovyWrapper extends groovy.util.Proxy { def wrapped GroovyWrapper(obj) { wrapped = obj adaptee = obj } def getProperty(String name) { wrapped.getProperty() } } def h = new GroovyWrapper(new HasProperty()) assert h.name == "pie"
这篇关于我可以在Java对象中实现Groovy的getProperty吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文