当前位置: 代码迷 >> J2SE >> java 动态代理报错,求指教
  详细解决方案

java 动态代理报错,求指教

热度:67   发布时间:2016-04-23 20:44:09.0
java 动态代理出错,求指教
请看,这是我写的动态代理
数据库用的是SQLite , 当然各位可以换成自己的:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;


public class Test {
ToolOfInPoolConnection tool = new ToolOfInPoolConnection() ;
public static void main(String[] args) 
throws ClassNotFoundExceptionSQLException {
Class.forName("org.sqlite.JDBC"  ) ;
Connection conn = DriverManager.getConnection("jdbc:sqlite:./test.db") ;
Test t = new Test() ;
conn = t.tool.proxyConnection(conn) ;
int hashcode = conn.hashCode() ;
System.out.println("打印一下哈希值:"+hashcode);
}
private class ToolOfInPoolConnection implements InvocationHandler {

public Connection proxyConnection(Connection conn){
conn = (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader() , conn.getClass().getInterfaces() , this );
return conn ;
}

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if( "close".equalsIgnoreCase(method.getName()) ){
System.out.println("ok");
}
return proxy;
}
}
}


数据库用的是SQLite , 当然各位可以换成自己的
----------
可是,以上程序报错了,我找不到错误根源,故请教各位,指教下
------解决方案--------------------
引用:
可是,以上程序报错了,我找不到错误根源,故请教各位,指教下


动态代理的概念你还没完全理解;

你上面的public Connection proxyConnection(Connection conn){ 
你希望代理的是Connection 实例;

当调用代理类的方法时,会回调invoke方法,在这个方法中你需执行Connection 的方法,然后返回方法的执行结果;不应该是你上面写的返回那个代理类对象;

改正:

private class ToolOfInPoolConnection implements InvocationHandler {

Connection conn;

public Connection proxyConnection(Connection conn){
this.conn = conn;
conn = (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader() , conn.getClass().getInterfaces() , this );
return conn ;
}

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if( "close".equalsIgnoreCase(method.getName()) ){
System.out.println("ok");
}else{
System.out.println("No");
}
return method.invoke(conn, args);
}
}
  相关解决方案