我可以在Java对象中实现Groovy的getProperty吗? [英] Can I implement Groovy's getProperty in Java Objects

查看:284
本文介绍了我可以在Java对象中实现Groovy的getProperty吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我有一个混合的Java / Groovy项目,我正在尝试向我的Java对象添加一些糖使得Groovy侧面更加清晰。

是否可以在Java类中实现 Object getProperty(String)在访问该实例的属性时Groovy会看到它吗?



我有一个失败的测试用例,如下所示:

  // HasProperty.java 
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 [...]
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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆