关于数据库连接池使用代理报 java.lang.ClassCastException

用到动态代理时会发生这样的错误:

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

原因是数据库驱动版本的问题;

当用到:

mysql-connector-java-5.0.8-bin.jar

则不会出报错;

但是,当用到:

mysql-connector-java-5.1.7-bin.jar (5.1以上)

则会报 java.lang.ClassCastException: $Proxy0 cannot be cast to java.sql.Connection;

 

Connection proxy = (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader(), conn.getClass().getInterfaces()
            , new InvocationHandler(){

                public Object invoke(Object proxy, Method method,
                        Object[] args) throws Throwable {
                }
            
        });

 在两个不同版本  打印出的结果不同

 Class[] interfaces = conn.getClass().getInterfaces();
  System.out.println(interfaces.length);
        for (Class c : interfaces) {
            System.out.println(c.getCanonicalName());
        }

  高版本的通过  conn.getClass().getInterfaces() 获得为 null

 将代码改为:

Connection proxy = (Connection) Proxy.newProxyInstance(conn.getClass()
                .getClassLoader(), new Class[]{Connection.class},
                new InvocationHandler() {

                    public Object invoke(Object proxy, Method method,
                            Object[] args) throws Throwable {
                    }

                });

 这样就可以获得所实现的接口。

posted @ 2015-10-06 18:36  手酒刘  阅读(468)  评论(0编辑  收藏  举报