我可以在Java对象中实现Groovy的getProperty
我有一个混合的Java / Groovy项目,我正在尝试为我的Java对象添加一些“糖”,以使Groovy端更清洁。
是否可以在Java类中实现Object getProperty(String)
并让Groovy在访问该实例上的属性时看到它?
我有一个失败的测试用例如下:
// 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"
}
}
测试失败没有大张旗鼓:
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 [...]
这是Groovy 1.8.6和Java 6.
答案 0 :(得分:2)
为了使这项工作不按照@ tim_yates的回答实现GroovyObject,你可以用一个非常简单的groovy对象包装对象。例如:
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"
答案 1 :(得分:0)
我从未尝试过,但我相信如果你创建了java类implement GroovyObject或extend GroovyObjectSupport,你应该能够将一个metaClass和这种动态属性创建添加到你的Java类中...
答案 2 :(得分:0)
看看Apache BeanUtils - http://commons.apache.org/beanutils/那里有一些非常有用的实用工具可以做这类事情。