MetaClass不拦截受保护的方法

时间:2014-05-16 23:21:06

标签: groovy

我正在测试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
    )
'''

1 个答案:

答案 0 :(得分:4)

此处的问题与受保护的方法无关。问题是您正在使用Groovy的运行时元编程来替换现有方法,然后在从Java调用相关方法时期望元编程发挥作用。这种元编程风格并不适用于直接从Java进行的方法调用。 groovy.sql.Sql类是用Java编写的,因此当groovy.sql.Sql中的代码调用createConnection方法时,会使用真正的方法,而不是元编程的方法。