相关疑难解决方法(0)

获取类的所有(派生)接口

java.lang.Class.getInterfaces返回所有直接实现的接口,即不遍历类树以获取所有父类型的所有接口.例如,层次结构

public interface A {}
public interface B {}
public interface C extends B {}

public class Foo implements A {} // Foo.class.getInterfaces() returns [A]
public class Bar implements C {} // Bar.class.getInterfaces() returns [C], note B is not included.
Run Code Online (Sandbox Code Playgroud)

因为Bar我想得到[B, C],但对于任意树深度.

我自己可以写这个,但我确定一个图书馆必须存在才能做到这一点,任何想法?

java reflection

38
推荐指数
3
解决办法
2万
查看次数

可以代理某些类而不代理其他类

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数据库连接

java reflection

5
推荐指数
1
解决办法
238
查看次数

标签 统计

java ×2

reflection ×2