【问题标题】:Android Groovy metaclassAndroid Groovy 元类
【发布时间】:2015-01-18 14:16:43
【问题描述】:

我正在尝试在 Groovy for Android 上编写一些代码,但我偶然发现了一个事实,即我无法使用 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 这个类只在 JDK 1.7 中加入。

你能想出我能克服这个问题的方法吗?当然我可以扩展一个类并给它想要的字段,但是,嘿,这可能错过了 Groovy 的重点。

【问题讨论】:

    标签: android groovy metaclass


    【解决方案1】:

    首先,在 Android 下使用运行时元编程可能不是一个好主意。并不是说它不好玩,而是它比使用 @CompileStatic 慢得多(因为在 Android 上我们别无选择,只能利用反射),最好只依赖语言的静态特性(这不会​​阻止逐个使用动态特性,如 JSonSlurper)。

    您看到的错误可能会在 Groovy 2.4.0-beta-4 中修复,但无论如何我不建议这样做。相反,我更倾向于使用扩展模块,它具有与静态编译兼容的优点。它们也可以让您增强现有的课程。

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

    【讨论】:

      【解决方案2】:

      您始终可以使用与 Android 完全兼容的语言,例如 SnapScript。拥有 Groovy 的所有特性,更好地支持远程调试。

      【讨论】:

        猜你喜欢
        • 2014-11-28
        • 2010-10-21
        • 2015-09-03
        • 2012-05-16
        • 2020-07-28
        • 2010-10-07
        • 2010-12-28
        • 2013-07-01
        • 2013-04-02
        相关资源
        最近更新 更多