groovy - 在运行时实例化接口的 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
很重要
解决方案
推荐阅读
- google-apps-script - 如何通过 API 访问特定视图或属性的 Google Analytics 过滤器
- ios - 在 WKWebview 中修改请求标头
- sql-server - SQL Server 不同类型的变量,$ 和@
- node.js - SailsJs,数据库查询返回一个空数组
- python - 使用 Flask 将 HTML 页面加载到 HTML 框架中
- python - 使用 Rexeg 查找特定字符串和引号之间
- r - 从 LSD.test (agricolae) 中取消嵌套组
- c++ - 如何在 Eclipse 调试器中更改 C++ 字符串值?
- javascript - 无法读取 null 的属性“setAttribute” - Javascript
- java - 从在 java 7 上运行的 java 代码在 linux 上执行 java 命令