2016-08-25 2 views
4

Я заметил странное поведение с Groovy MetaClass, и мне интересно, может ли кто-нибудь дать мне понять, что здесь происходит.groovy invokeMethod добавить метод в metaclass потребности, если утверждение?

Это прекрасно работает:

@Override 
Object invokeMethod(String name, Object args) { 
    if(true) { 
     println("Should only see this once") 
     def impl = { Object theArgs -> println("Firing WeirdAction") } 
     getMetaClass()."$name" = impl 
     return impl(args) 
    } 
} 

Однако, если я снимаю, если заявление он бросает MissingPropertyException:

@Override 
Object invokeMethod(String name, Object args) { 
    println("Should only see this once") 
    def impl = { Object theArgs -> println("Firing WeirdAction") } 
    getMetaClass()."$name" = impl 
    return impl(args) 
} 

Вот мой класс конкретизации и называть, класс пусто выше, за исключением определение метода.

IfTester sut = new IfTester() 
sut.WeirdAction() 

У кого-нибудь есть идея, что я не понимаю здесь?

ответ

1

Использование Groovy 2.4.5, выпуск, как представляется, относится к getMetaClass() по сравнению с IfTester.getMetaClass(). Рассмотрим:

class IfTester { 

    @Override 
    Object invokeMethod(String name, Object args) { 
     if (true) { 
     println "Should only see this once" 
     def impl = { def theArgs -> println "Firing WeirdAction" } 
     def mc1 = getMetaClass() 
     println "mc1: " + mc1 
     println "----" 
     def mc2 = IfTester.getMetaClass() 
     println "mc2: " + mc2 
     IfTester.getMetaClass()."$name" = impl 
     return impl(args) 
     } 
    } 
} 

IfTester sut = new IfTester() 
sut.WeirdAction() 

с if(true), затем mc1 и mc2 идентичны, и оба работают. Без if, mc1 отличается и использование этого стиля вызывает ошибку.

Я не знаю первопричины, и если это ошибка. Как бы то ни было, кажется, что существует проблема определения или что смысл this отличается в этом контексте.

+0

Запустив ваш пример и заметив разные обратные вызовы между вызовом класса и вызовом экземпляра, я снова нашел googled и нашел аналогичный поток https://stackoverflow.com/questions/34449587/groovy-this-metaclass-versus-instance- метакласса. Мне странно, что сфера действия меняет вызов от экземпляра к классу, но, возможно, я не полностью его понимаю. – gt124

Смежные вопросы