groovy invokeMethod添加方法到metaclass需要if语句?
发布时间:2020-12-14 16:21:46 所属栏目:大数据 来源:网络整理
导读:我注意到Groovy MetaClass有一些奇怪的行为,我想知道是否有人能给我一个线索,告诉我这里发生了什么. 这很好用: @OverrideObject invokeMethod(String name,Object args) { if(true) { println("Should only see this once") def impl = { Object theArgs -
我注意到Groovy 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) } } 但是,如果我取消if语句,它会抛出一个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() 任何人都知道我在这里误会了什么? 解决方法
使用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是不同的,并且使用该样式会导致错误. 我不知道根本原因,也不知道它是不是一个bug.不知何故,似乎存在一个范围问题,或者在这种情况下这种感觉是不同的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |