我正在测试groovy.sql.Sql MetaClass中的运行时更改,修改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
)
'''
答案 0 :(得分:4)
此处的问题与受保护的方法无关。问题是您正在使用Groovy的运行时元编程来替换现有方法,然后在从Java调用相关方法时期望元编程发挥作用。这种元编程风格并不适用于直接从Java进行的方法调用。 groovy.sql.Sql类是用Java编写的,因此当groovy.sql.Sql中的代码调用createConnection方法时,会使用真正的方法,而不是元编程的方法。