我可以在Java Objects中实现Groovy的getProperty

时间:2012-07-06 14:38:10

标签: java groovy

我可以在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.

3 个答案:

答案 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 GroovyObjectextend GroovyObjectSupport,你应该能够将一个metaClass和这种动态属性创建添加到你的Java类中...

答案 2 :(得分:0)

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