首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android Groovy元类

Android Groovy元类
EN

Stack Overflow用户
提问于 2014-11-20 16:15:37
回答 2查看 248关注 0票数 0

我正在尝试在Groovy上编写一些代码,我偶然发现一个事实:我不能使用metaclass动态地向对象添加一个属性:

代码语言:javascript
复制
it.mapMarker.metaClass.project = it

它失败了

代码语言:javascript
复制
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的要点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-21 08:01:17

首先,这可能不是在Android环境下使用运行时元编程的好主意。这并不是说它不好玩,但它比使用@CompileStatic慢得多(因为在Android上,除了利用反射之外,我们别无选择),最好只依赖于语言的静态特性(这并不能阻止逐个案例地使用JSonSlurper这样的动态特性)。

您所看到的错误可能会在Groovy2.4.0-beta-4中修复,但无论如何,我不会再次建议这样做。相反,我倾向于使用扩展模块,这些模块具有与静态编译兼容的优点。它们也将允许您增强现有的类。

例如,请参阅我在SpeakerTime演示中使用的代码:有一个名为extensions的模块,它为Context类提供扩展方法。我认为这是走的路。

票数 3
EN

Stack Overflow用户

发布于 2016-04-28 19:40:54

您可以始终使用一种语言,如SnapScript,它与安卓完全兼容。具有Groovy的所有特性,并且更好地支持远程调试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27044352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档