Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy 元类未拦截受保护的方法_Groovy - Fatal编程技术网

Groovy 元类未拦截受保护的方法

Groovy 元类未拦截受保护的方法,groovy,Groovy,我正在测试groovy.sql.sql元类中的运行时更改,修改createConnection方法。我的目标是在请求某些连接时始终调用进程 更改受保护的方法是否有限制?我可以看到我的更改没有效果,如果我记录invokeMethod(),则只打印公共方法 也许我的方法不对?这是我的剧本: @Grapes([ @Grab(group='com.h2database', module='h2', version='1.3.160'), @GrabConfig(systemClassLo

我正在测试groovy.sql.sql元类中的运行时更改,修改createConnection方法。我的目标是在请求某些连接时始终调用进程

更改受保护的方法是否有限制?我可以看到我的更改没有效果,如果我记录
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,用示例编辑。