请看,这是我写的动态代理
数据库用的是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 ClassNotFoundException, SQLException {
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);
}
}