1.动态代理的原理 :
(1).在运行时通过一个类的字节码对象-反射,操作原对象。
(2).动态代理就是通过反射来实现的。
(3).被代理的类,必须应该具有一个接口。
(4).动态代理通过两个类来实现:
a:Proxy- 生成代理类的工具类。
b:InvocationHandler- 拦截代理类的句柄。
2.动态代理的好处 :动态代理可以在不修改污染原类的情况下,修改目标类的执行。
3.动态代理的实例代码
package cn.itcast.utils;
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.util.LinkedList;
public class ConnUtils {
//使用LinedList加快存取速度
private static LinkedList<Connection> pool = new LinkedList<Connection>();
static{
try{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql:///itcast?characterEncoidng=UTF8";
for(int i=0;i<3;i++){
final Connection con = DriverManager.getConnection(url,"root","1234");
Object proxedObj =
Proxy.newProxyInstance(
ConnUtils.class.getClassLoader(),
new Class[]{Connection.class},
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//判断是否调用的是closre方法
if(method.getName().equals("close")){
System.err.println("有人还连接...");
synchronized (pool) {
pool.addLast((Connection) proxy);
pool.notify();
}
return null;
}
return method.invoke(con, args);
}
});
//将代理放到池中
pool.add((Connection) proxedObj);
}
}catch(Exception e){
e.printStackTrace();
}
}
public static Connection getCon(){
synchronized (pool) {
if(pool.size()==0){
try {
pool.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
return getCon();
}else{
return pool.removeFirst();
}
}
}
}
该贴被鲲鹏展翅编辑于2012-11-23 9:04:28