1、定义
给某一个对象提供一个代理,由代理对象来控制对原对象的访问。
2、java.lang.Proxy
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Dao {
public void update();
public void insert();
}
class JdbcDao implements Dao {
@Override
public void update() {
System.out.println("in jdbc update");
}
@Override
public void insert() {
System.out.println("in jdbc insert");
}
}
class HibernateDao implements Dao {
@Override
public void update() {
System.out.println("in hibernate update");
}
@Override
public void insert() {
System.out.println("in hibernate insert");
}
}
class MyInvocationHandler implements InvocationHandler {
Object obj;
// 构造代理对象
public Object get(Object obj) {
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
System.out.println("before invoke...");
// invoke执行原对象的方法
Object result = arg1.invoke(obj, arg2);
System.out.println("after invoke...");
return result;
}
}
public class ProxyTest {
public static void main(String[] args) {
Dao dao = new JdbcDao();
MyInvocationHandler handler = new MyInvocationHandler();
// InvocationHandler类可生成代理对象
Dao daoProxy = (Dao) handler.get(dao);
// 输出代理对象
System.out.println("dynamic proxy's name: " + daoProxy.getClass().getName());
// 执行代理对象的方法
daoProxy.insert();
daoProxy.update();
}
}
输出:
dynamic proxy's name: test.$Proxy0
before invoke...
in jdbc insert
after invoke...
before invoke...
in jdbc update
after invoke...