JDK动态代理
原理
java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvocationHandler来处理。
核心类
Proxy 创建代理利用反射机制生成一个实现接口的匿名类。
InvocationHandler 方法拦截器接口 需要实现invoke方法。
局限
只能代理实现了接口的类。
代码
public class JDKProxyMain {
interface JDKProxyTestInterface{
String testProxy(String str);
}
static class JDKTestInterfaceImpl implements JDKProxyTestInterface{
@Override
public String testProxy(String str) {
System.out.println(str);
return "result:" + str;
}
}
static class JDKProxyTestInvocationHandler implements InvocationHandler{
private Object target;
public JDKProxyTestInvocationHandler(Object target){
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("执行前");
Object result = method.invoke(this.target, args);
System.out.println("执行后");
return result;
}
}
public static void main(String[] args) {
JDKTestInterfaceImpl target = new JDKTestInterfaceImpl();
JDKProxyTestInterface proxy = (JDKProxyTestInterface)Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new JDKProxyTestInvocationHandler(target));
for (int i = 0; i < proxy.getClass().getInterfaces().length; i++) {
System.out.println(proxy.getClass().getInterfaces()[i]);
}
String result = proxy.testProxy("testJDKProxy");
System.out.println(result);
}
}
interface test.proxy.JDKProxyMain$JDKProxyTestInterface
执行前
testJDKProxy
执行后
result:testJDKProxy
cglib动态代理
原理
cglib动态代理是利用了asm开源包,将代理对象类的class文件加载进来,通过修改字节码生成子类来处理。
核心类
Enhancer 主要增强类,通过字节码动态技术创建委托类的子类实例。
MethodInterceptor 方法拦截器接口,需要实现intercept方法。
局限
不能对final修饰的类进行代理,也不能final修饰的方法。
代码
public class CglibProxyMain {
static class CglibProxyService{
public CglibProxyService(){
}
String testProxy(String str){
System.out.println(str);
return 2+str;
}
}
static class CglibProxyInterceptor implements MethodInterceptor{
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("执行前");
Object object = methodProxy.invokeSuper(o, objects);
System.out.println("执行后");
return object;
}
}
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(CglibProxyService.class);
enhancer.setCallback(new CglibProxyInterceptor());
CglibProxyService proxy = (CglibProxyService)enhancer.create();
System.out.println(CglibProxyService.class);
System.out.println(proxy.getClass());
String result = proxy.testProxy("testProxy");
System.out.println(result);
}
}
class test.proxy.CglibProxyMain$CglibProxyService
class test.proxy.CglibProxyMain$CglibProxyService$$EnhancerByCGLIB$$920fa865
执行前
testProxy
执行后
2testProxy