1

我可以在 Java 对象中实现 Groovy 的 getProperty

我有一个混合的 Java/Groovy 项目,我正在尝试向我的 Java 对象添加一些“糖”以使 Groovy 端更干净。

是否可以Object getProperty(String)在 Java 类中实现并让 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。

4

3 回答 3

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"
于 2012-07-06T17:26:42.657 回答
0

我从未尝试过,但我相信如果你让你的 java 类实现 GroovyObject扩展 GroovyObjectSupport,你应该能够向你的 Java 类添加一个 metaClass 和这种动态属性创建......

于 2012-07-06T14:47:25.193 回答
-1

看看 Apache BeanUtils - http://commons.apache.org/beanutils/那里有一些非常有用的实用程序可以做这种事情。

于 2012-07-06T17:15:15.700 回答