1

GroovyのgetPropertyをJavaオブジェクトに実装できますか

JavaとGroovyの混合プロジェクトがあり、Groovy側をよりクリーンにするために、Javaオブジェクトに「砂糖」を追加しようとしています。

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 [...]

これはGroovy1.8.6とJava6です。

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 を拡張すると、metaClass とこの種の動的プロパティの作成を Java クラスに追加できるはずです...

于 2012-07-06T14:47:25.193 に答える
-1

Apache BeanUtils を見てください - http://commons.apache.org/beanutils/には、この種のことを行う非常に便利なユーティリティがいくつかあります。

于 2012-07-06T17:15:15.700 に答える