用Java模拟鸭子打字

时间:2010-12-01 23:50:57

标签: java groovy rhino dynamic-languages duck-typing

问题:我希望能够在Java ojbect中一般性地访问Java 中的任何属性/字段,类似于动态语言(想想Groovy, JavaScript)会的。我不知道当时我正在编写这个管道代码它是什么类型的对象或属性/字段名称是什么。但是当我去使用它时,我会知道属性/字段名称。

我当前的解决方案:到目前为止,我编写了一个简单的包装器类,它使用java.beans.Introspector来获取Bean / POJO的属性并将它们公开为Map<String, Object> 。它很粗糙但适用于简单的情况。

我的问题除了反映/转换为地图之外,还有哪些方法可以解决这个问题?

在我走得太远之前,我想知道是否有人知道我怎么能从犀牛那里蚕食一些东西,或者javax.script.*有一个经过深思熟虑的实施这个概念的东西。或者也许是一种我没有考虑过的完全不同的方法。

编辑:是的我熟悉反射(我相信Introspector无论如何都在使用它)。如果还有其他经过深思熟虑的解决方案,我只是很好奇。

编辑2:似乎最受欢迎的答案涉及1)直接或通过辅助类进行反射,和/或2)映射到实现所需类成员的接口。关于利用Groovy的评论,我真的很感兴趣。由于Groovy具有真正的duck-typing并且它是一种JVM语言,有没有办法在Groovy中创建一个简单的帮助器并从Java调用它?这将非常酷,可能更灵活,性能更好。

答案:我认为Mike的答案是最好的,因为它是一个最接近的完整概念。对于这种特殊情况,我可能不会采用这种方式,但它肯定是一种有用的方法。任何看过这个的人都应该确保阅读这里的对话,因为那里有很多有用的信息。

谢谢!

3 个答案:

答案 0 :(得分:10)

答案 1 :(得分:1)

我刚刚遇到的另一种利用(滥用?)类型擦除的方法很有趣:

http://rickyclarkson.blogspot.com/2006/07/duck-typing-in-java-and-no-reflection.html

我不确定我是否认为这与直接使用界面有很大不同,但也许对其他人有用。

答案 2 :(得分:0)

看一下java.lang.Class的方法和反射API:java.lang.reflect。*