Groovy 元类未拦截受保护的方法
我正在测试groovy.sql.sql元类中的运行时更改,修改createConnection方法。我的目标是在请求某些连接时始终调用进程 更改受保护的方法是否有限制?我可以看到我的更改没有效果,如果我记录Groovy 元类未拦截受保护的方法,groovy,Groovy,我正在测试groovy.sql.sql元类中的运行时更改,修改createConnection方法。我的目标是在请求某些连接时始终调用进程 更改受保护的方法是否有限制?我可以看到我的更改没有效果,如果我记录invokeMethod(),则只打印公共方法 也许我的方法不对?这是我的剧本: @Grapes([ @Grab(group='com.h2database', module='h2', version='1.3.160'), @GrabConfig(systemClassLo
invokeMethod()
,则只打印公共方法
也许我的方法不对?这是我的剧本:
@Grapes([
@Grab(group='com.h2database', module='h2', version='1.3.160'),
@GrabConfig(systemClassLoader = true)
])
import com.h2database.*
import groovy.sql.*
import java.sql.*
def originalMethod = Sql.metaClass.&createConnection
Connection.metaClass.createConnection = {
println "Called $name"
originalMethod.invoke(this)
}
def db = Sql.newInstance('jdbc:h2:mem:', 'sa', '', 'org.h2.Driver')
// Setup database.
db.execute '''
create table if not exists languages(
id int primary key,
name varchar(20) not null
)
'''
这里的问题与受保护的方法无关。问题在于,您正在使用Groovy的运行时元编程来替换现有的方法,然后期望在从Java调用所讨论的方法时,元编程能够发挥作用。这种元编程风格不适用于直接从Java进行的方法调用。groovy.sql.sql类是用Java编写的,因此,当groovy.sql.sql内部的代码调用createConnection方法时,将使用实际的方法,而不是元编程的方法。实际实现是什么?如何使用
MethodClosure
originalMethod
?originalMethod用于应用groovy.sql.sql
的原始逻辑返回连接。“实际实现”指的是Sql类impl,或者我的createConnection替换?您的替换。如果可行的话,整个脚本基本上都是一个可行的示例,说明了问题的具体情况。只是一个提示,在类或实例上创建了一个方法指针,而不是元类。因此,首先使用def originalMethod=Sql&createConnection
。按照现在的方式,使用我建议的更改,您会因为对createConnection
的递归调用而出现堆栈溢出,因此添加完整用例将有助于解决实际问题,我希望。@dmahapatro Ok,用示例编辑。