UPDATE解决方案是 Java.lang.reflect.Proxy从调用返回另一个代理,在分配时导致ClassCastException
我的测试代码代理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;
Run Code Online (Sandbox Code Playgroud)
当我包装H2 DB连接时,这非常有效.
当我尝试包装MySQL连接时,Connection返回中代理的强制转换失败,即使connection我的包装是类型的Connection.例外是:
java.lang.ClassCastException: $Proxy11 cannot be cast to java.sql.Connection
Run Code Online (Sandbox Code Playgroud)
H2连接的日志行是:
connection is org.h2.jdbc.JdbcConnection, true
proxy is $Proxy9, true
Run Code Online (Sandbox Code Playgroud)
对于MySQL连接:
connection is com.mysql.jdbc.JDBC4Connection, true
proxy is $Proxy11, false
Run Code Online (Sandbox Code Playgroud)
发生了什么,为什么我不能包装MySQL数据库连接?
问题是这一行:
connection.getClass().getInterfaces()
Run Code Online (Sandbox Code Playgroud)
它只是为您提供由您想要代理的类直接实现的接口。如果连接接口被实现,例如 通过 MySql-Connection 类的超类(假设为 AbstractConnection),您的代理将不会实现 Connection 接口。
要解决此问题,请将连接接口添加到代理应实现的接口数组中。
| 归档时间: |
|
| 查看次数: |
238 次 |
| 最近记录: |