2

首先,如果我说一些明显的话,请原谅我,因为我没有研究这个问题的答案,这只是我想到的东西,无法通过快速谷歌搜索找到答案(我也不知道 Groovy出色地)。

我正在阅读 Groovy in action(第 1 版),在第 7.6 节中它指出“如果您希望将普通的 Java 类识别为 Groovy 类,您只需实现 GroovyObject 接口。为方便起见,您还可以子类化抽象类 GroovyObjectSupport,它提供默认实现。”

所以我正在尝试一些 Java/Groovy(试图找到使 Java 编码更快/更容易的方法),并且我正在实例化这个对象 Person,它是一个 Java 对象,而 Person 类与它没有任何关系Groovy(即不实现 GroovyObject 或任何东西)。Person 有一个受保护的字段,名称,带有 getter/setter。我可以在一个 groovy 测试用例(扩展 GroovyTestCase)中像这样访问它,顺便说一句,它在不同的包中,不应该像这样访问:

Person person = new Person('joe')
println "Name: ${person.name}"

这不是使用Groovy 对象具有的元信息,即Groovy 会拦截、获取“person.name”的“name”部分并调用getName() 方法或类似的东西吗?但是 person 是一个 Java 对象……也就是说,它不应该有可用的逻辑。

我还没有实现 GroovyObject 或扩展 GroovyObjectSupport,但似乎这个 Java 对象具有我可以使用的 Groovy 特性。

我的问题是,我可以从 Groovy 中使用的 Java 对象中假设什么?显然在幕后做了一些事情来用一些 Groovy 特性来扩充 Java 定义的类......但是,哪些特性呢?

所以,我想我的问题可以归结为:“在 Groovy 上下文中使用 Java 类时做了什么?”

任何有关该主题的信息将不胜感激,谢谢:)

4

2 回答 2

4

Groovy 确实增强了您的 Java 类。问题是当您想从 Java 中使用这些增强的 Java 类时。然后,您需要采用GroovyObjectandGroovyObjectSupport策略。

关于您可以期待什么,您可以查看 groovy 文档:

eclipse 插件也非常适合从 Groovy 自动完成 Java 类。


Java 对象通过 Groovy 的元对象协议 (MOP) 得到了增强,该协议拦截并自己调度方法和属性。这就是你可以拦截东西的原因,这就是如何将新方法添加到 Java 的最终类中的原因。

Groovy 的 MOP 使用缓存策略和反射器类来实现良好的性能。

于 2012-11-22T19:36:18.793 回答
1

您还可以通过覆盖 resolveClass 方法并更改类加载器来通过 ObjectInputStream 读取 Groovy 对象。见http://www.feiteira.org/2013/04/reading-groovy-objects-from-java.html

于 2013-04-30T16:24:48.867 回答