我正在尝试在Groovy上编写一些代码,我偶然发现一个事实:我不能使用metaclass动态地向对象添加一个属性:
it.mapMarker.metaClass.project = it它失败了
java.lang.NoClassDefFoundError: Failed resolution of: Ljava/lang/invoke/MethodHandles;
at org.codehaus.groovy.vmplugin.v7.IndyInterface.<clinit>(IndyInterface.java:81)
at org.codehaus.groovy.vmplugin.v7.Java7.invalidateCallSites(Java7.java:31)
at org.codehaus.groovy.reflection.ClassInfo.incVersion(ClassInfo.java:87)
at groovy.lang.MetaClassImpl.incVersion(MetaClassImpl.java:3445)
at groovy.lang.ExpandoMetaClass.performRegistryCallbacks(ExpandoMetaClass.java:931)
at groovy.lang.ExpandoMetaClass.access$400(ExpandoMetaClass.java:254)
at groovy.lang.ExpandoMetaClass$2.call(ExpandoMetaClass.java:860)
at groovy.lang.ExpandoMetaClass.performOperationOnMetaClass(ExpandoMetaClass.java:813)
at groovy.lang.ExpandoMetaClass.registerBeanProperty(ExpandoMetaClass.java:842)
at groovy.lang.ExpandoMetaClass.setProperty(ExpandoMetaClass.java:791)
at org.codehaus.groovy.runtime.HandleMetaClass.setProperty(HandleMetaClass.java:91)
at org.codehaus.groovy.runtime.InvokerHelper.setProperty(InvokerHelper.java:191)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.setProperty(ScriptBytecodeAdapter.java:480)我想原因是MethodHandle类只是在JDK1.7中添加的。
你能想到我能克服的方法吗?当然,我可以扩展一个类,并给它提供想要的字段,但是嘿,这可能忽略了Groovy的要点。
发布于 2014-11-21 08:01:17
首先,这可能不是在Android环境下使用运行时元编程的好主意。这并不是说它不好玩,但它比使用@CompileStatic慢得多(因为在Android上,除了利用反射之外,我们别无选择),最好只依赖于语言的静态特性(这并不能阻止逐个案例地使用JSonSlurper这样的动态特性)。
您所看到的错误可能会在Groovy2.4.0-beta-4中修复,但无论如何,我不会再次建议这样做。相反,我倾向于使用扩展模块,这些模块具有与静态编译兼容的优点。它们也将允许您增强现有的类。
例如,请参阅我在SpeakerTime演示中使用的代码:有一个名为extensions的模块,它为Context类提供扩展方法。我认为这是走的路。
发布于 2016-04-28 19:40:54
您可以始终使用一种语言,如SnapScript,它与安卓完全兼容。具有Groovy的所有特性,并且更好地支持远程调试。
https://stackoverflow.com/questions/27044352
复制相似问题