gpt4 book ai didi

java - 可以代理某些类但不能代理其他类

转载 作者:搜寻专家 更新时间:2023-11-01 00:51:35 25 4
gpt4 key购买 nike

更新 解决方案是 Java.lang.reflect.Proxy returning another proxy from invocation results in ClassCastException on assignment

我的测试代码代理 java.sql.Connection

我这样创建我的代理:

log.info("connection is "+connection.getClass().getName()+", "+
(connection instanceof Connection));
Object proxy = java.lang.reflect.Proxy.newProxyInstance(
connection.getClass().getClassLoader(),
connection.getClass().getInterfaces(),
new MockFailureWrapper(connection));
log.info("proxy is "+proxy.getClass().getName()+", "+
(proxy instanceof Connection));
return (Connection)proxy;

当我包装一个 H2 数据库连接时,这非常有效。

当我尝试包装 MySQL 连接时,在返回中将代理转换为 Connection 失败,即使我包装的 connection连接。异常(exception)情况是:

java.lang.ClassCastException: $Proxy11 cannot be cast to java.sql.Connection

H2 连接的日志行是:

connection is org.h2.jdbc.JdbcConnection, true
proxy is $Proxy9, true

对于 MySQL 连接:

connection is com.mysql.jdbc.JDBC4Connection, true
proxy is $Proxy11, false

发生了什么,为什么我不能包装 MySQL 数据库连接

最佳答案

问题是这一行:

connection.getClass().getInterfaces()

它只是为您提供由您要代理的类直接实现的接口(interface)。如果连接接口(interface)被实现 f.eg。通过 MySql-Connection 类的父类(super class)(可以说是 AbstractConnection),您的代理将不会实现 Connection 接口(interface)。

要解决此问题,请将连接接口(interface)添加到您的代理应实现的接口(interface)数组中。

关于java - 可以代理某些类但不能代理其他类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13305843/

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