【发布时间】:2011-05-18 20:04:51
【问题描述】:
问题:我希望能够像使用动态语言一样(想想 Groovy, JavaScript)会。在编写此管道代码时,我不知道它是什么类型的对象或属性/字段名称是什么。但是当我去使用它时,我会知道它的属性/字段名称。
我当前的解决方案: 到目前为止,我已经编写了一个简单的包装类,它使用java.beans.Introspector 来获取 Bean/POJO 的属性并将它们公开为 Map<String, Object>。这很粗糙,但适用于简单的情况。
我的问题是除了反射/转换为地图之外,还有哪些其他方法可以解决这个问题?
在我在这条道路上走得更远之前,我想知道是否有人知道我如何从 Rhino 或 javax.script.* 中蚕食一些东西,它对这个概念进行了深思熟虑的实施。或者也许是我没有考虑过的完全不同的方法。
编辑: 是的,我对反射很熟悉(我相信这是 Introspector 在后台使用的)。我只是好奇是否还有其他经过深思熟虑的解决方案。
编辑 2: 似乎最流行的答案涉及 1)直接或通过帮助类进行反射,和/或 2)映射到实现所需类成员的接口。我对有关利用 Groovy 的评论很感兴趣。由于 Groovy 具有真正的鸭子类型并且它是一种 JVM 语言,有没有办法在 Groovy 中制作一个简单的助手并从 Java 中调用它?这会很酷,可能更灵活,性能更好。
答案:我将 Mike 的答案标记为最佳答案,因为它是最接近的完整概念。对于这种特殊情况,我可能不会走那条路,但这肯定是一种有用的方法。任何浏览此内容的人都应该确保阅读这里的对话,因为那里也有很多有用的信息。
谢谢!
【问题讨论】:
-
这只是学术练习吗?
-
你知道java反射吗?它允许您通过名称以任何方法访问任何字段,但如果您想对程序中的每个命令都使用它,则相当复杂。
-
反射是要走的路,特别是如果您直到运行时才知道要调用什么。
-
JRuby 或 Groovy 等本身怎么样? IE。将它们用作代理。
-
@McKAMEY :如果您在编译时需要它,您可以生成代码以满足给定接口(甚至可以创建接口),这更像是“结构类型”(这就是我所做的)
标签: java groovy rhino dynamic-languages duck-typing