Свойство metaClass на классах Java в Groovy - PullRequest
4 голосов
/ 14 января 2012

Я изучаю Groovy, и у меня есть вопрос относительно его возможностей метапрограммирования. Из того, что я понимаю, каждый объект в groovy реализует интерфейс groovy.lang.GroovyObject (неявно добавляемый компилятором groovy). Последний интерфейс содержит метод getMetaClass (), поэтому я могу сделать следующее:

class MyGroovyClass{
}
def myGroovyClass = new MyGroovyClass();
println myGroovyClass.metaClass.name

Я не понимаю, как объекты, скомпилированные Java-компилятором, таким как java.lang.String, получают свойство metaClass. Определяется ли это свойство в самом объекте MetaClass, который связывается с java-классами через MetaClassRegistry?

Ответы [ 2 ]

3 голосов
/ 14 января 2012

В дополнение к методам, добавленным через протокол мета-объектов, Groovy также расширяет классы в JDK с помощью дополнительных методов, определенных в классе groovy.runtime.DefaultGroovyMethods. List и другие коллекции получают методы типа each и collect. Тот же механизм добавляет getMetaClass метод к java.lang.Object.

1 голос
/ 14 января 2012

Правильно, метаклассы POJO ищутся в реестре.

В этой презентации представлен общий обзор того, как метаклассы используются объектами Groovy и POJ.(С оговоркой, что он немного стар.)

...