首页 > 解决方案 > 在运行时实例化接口的 Groovy 方法?

问题描述

目标:在运行时实例化一个接口,然后处理对它的任何调用。“任何”我的意思是即使方法的调用也没有直接在接口中定义。

设计:我将 aMap转换为所需的类型,然后将一些方法添加到它的metaClass.

结果:这个生物可以成功处理未声明的方法,但它不能处理诚实声明的方法——抛出 UnsupportedOperationException。

问题:我也可以处理声明的方法吗?

interface StackApi {
    void declaredMethod()
}

@Test
void reproduction() {
    StackApi api = [:].asType(StackApi)
    api.metaClass.declaredMethod = { Object[] args -> println "declaredMethod!"}
    api.metaClass.undeclaredMethod = { Object[] args -> println "undeclaredMethod!"}
    api.undeclaredMethod() // invoked ok
    api.declaredMethod() // UnsupportedOperationException thrown
}

UPD。我设法部分解决了这个问题(见下文),但它仅适用于已知的方法名称。可能有一种方法可以设置一个完全接受所有调用的处理程序?

@Test
void partial_success() {
    StackApi api = [
            declaredMethod: { Object[] args -> println "declaredMethod!"},
    ].asType(StackApi)
    api.metaClass.undeclaredMethod = { Object[] args -> println "undeclaredMethod!"}
    api.undeclaredMethod() // ok
    api.declaredMethod() // ok
}

PS铸造StackApi很重要

标签: groovy

解决方案


推荐阅读