Class.forName newInstance объекта домена, а не GroovyObject из-за пределов Grails

У меня есть скомпилированный проект Grails, и из отдельного проекта groovy я рефлективно загружаю класс предметной области следующим образом.

Class clazz = Class.forName('mypack.myclass', true, Thread.currentThread().contextClassLoader)
def newDomainObject = clazz.newInstance()

При запуске из-за пределов Grails (в моем отдельном проекте groovy) объект не распознается как GroovyObject.

println newDomainObject instanceof GroovyObject // false

Поскольку я работаю вне Grails, я думаю, что groovy будет обрабатывать доменный класс так же, как и любой другой класс (и, глядя на файл класса, он действительно реализует GroovyObject).

Я думаю, что это как-то связано с тем, как Grails компилирует объект предметной области, но я не уверен, что здесь происходит.

Обратите внимание, что это связано с Почему Class.forName не работает на доменные классы Grails, но разные.


person Jeff Storey    schedule 05.10.2012    source источник


Ответы (1)


Это кажется невозможным — точно так же, как javac изменяет классы, которые явно не расширяют базовый класс для расширения java.lang.Object, groovyc изменяет все классы Groovy для реализации groovy.lang.GroovyObject.

Вы смотрите на класс, скомпилированный в проекте Groovy, из общего класса .groovy или на скомпилированный класс в банке?

instanceof сложна из-за порядка оценки Groovy; попробуйте добавить скобки:

println (newDomainObject instanceof GroovyObject)

Если это по-прежнему выводит false, попробуйте рекурсивно сбросить все реализованные интерфейсы:

while (clazz != Object) {
   def interfaces = clazz.interfaces
   if (interfaces) {
      clazz.interfaces.each { println "$clazz.name implements $it.name" }
   }
   else {
      println "$clazz.name doesn't directly implement any interfaces"
   }
   clazz = clazz.superclass
}
person Burt Beckwith    schedule 05.10.2012
comment
Берт, я тоже думал, что это невозможно. Чтобы ответить на ваш вопрос, я использую общий файл .groovy из другого проекта. Я хочу назвать это затмением чего-то, что было испорчено в моей среде разработки. Я не знаю, так ли это на самом деле, но вдруг это работает. - person Jeff Storey; 06.10.2012