java有两种动态代理
一:JDK动态代理:Proxy
二:CGLIB动态代理:Enhancer
动态代理的实质是利用字节码工具,生成新的代理类,替换原始的类。
我们首先看JDK代理模式
创建代理对象需要入参 ClassLoader,被代理的对象的接口数组,一个新的InvocationHandler。
看demo
public class ProxyFactoryTest {
public static Object getProxyObj(Object targetObj){
MyInvocationHandler invocation = new MyInvocationHandler(targetObj);
return Proxy.newProxyInstance(targetObj.getClass().getInterfaces()[0].getClassLoader(),new Class[]{ targetObj.getClass().getInterfaces()[0]}, invocation);
}
}
public class MyInvocationHandler implements InvocationHandler {
private Object originBean;
public MyInvocationHandler(Object originBean) {
this.originBean = originBean;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
beforeProxy();
Object result = method.invoke(originBean, args);
afterProxy();
return result;
}
private void afterProxy() {
System.out.println("after proxy");
}
private void beforeProxy() {
System.out.println("before proxy");
}
}
public interface SelfInterface {
String getName();
}
public class SelfBean implements SelfInterface {
@Override
public String getName() {
System.out.println("selfBean");
return "this is SelfBean";
}
}
在我们调用ProxyFactoryTest的getProxyObj方法的时候,我们生成了一个新的class
新的Class继承了Proxy,实现了实际SelfBean的接口。那在执行getName()方法是,字节码已经变成了执行InvocationHandler的invoke()方法,这个就是我们在新建代理对象时,传入的自定义的InvocationHandler;
上面就是JDK的动态代理。