个人理解:
动态代理是面向接口执行的,他是根据java的反射机制动态生成的。
1,首先,有一个类,类中有执行 的方法。
public interface Count {
public void queryCount();
public void updateCount();
}
2,然后有一个实现类,去实现接口
public class CountImpl implements Count {
@Override
public void queryCount() {
System.out.println("query...");
}
@Override
public void updateCount() {
System.out.println("update...");
}
}
3,写一个代理处理器类
public class CountProxy implements InvocationHandler{
private Object target; //被代理的对象
public Object getTarget() {
return target;
}
public void setTarget(Object target) { //set方法可以直接将对象set近要执行代理的方法
this.target = target;
}
public void before(Method method){ //执行 代码 之前的方法
System.out.println(method.getName() + " start !");
}
public void after(Method method){ //执行 代码 之后的方法
System.out.println(method.getName() + " end !");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//proxy 产生代理 method 方法 args 参数
before(method);
method.invoke(target, args); //target 被代理对象
after(method);
return null;
}
}
4,执行方法
public class TestCount {
public static void main(String[] args) {
Count count = new CountImpl(); //产生被代理对象
CountProxy proxy = new CountProxy();
proxy.setTarget(count); // 设置被代理对象
Count countProxy = (Count) Proxy.newProxyInstance(Count.class.getClassLoader(), count.getClass().getInterfaces(), proxy);
//产生代理 Count.class.getClassLoader() 被代理对象的ClassLoader()
//count.getClass().getInterfaces() 产生被代理对象实现的接口
//proxy 用的InvocationHandler处理方式;
countProxy.queryCount();
countProxy.updateCount();
}
}