gpt4 book ai didi

groovy - MetaClass 没有拦截 protected 方法

转载 作者:行者123 更新时间:2023-12-05 01:22:50 26 4
gpt4 key购买 nike

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

是否有更改 protected 方法的限制?我可以看到我的更改没有效果,如果我记录 invokeMethod(),只会打印公共(public)方法。

也许我的方法不正确?这是我的脚本:

@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
)
'''

最佳答案

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

关于groovy - MetaClass 没有拦截 protected 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23705897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com