动态代理
我们常用的动态代理分类两类,接口代理,也就是JDK提供给我们的,它的特点就是字节码随意改动,随用随加载。还有一类就是子类代理,通过第三方CGLIB实现代理。
1.接口代理
*创建代理对象的要求:
* 被代理的类至少实现一个接口,没有则不能用。
* newProxyInstance方法的参数:
* classloade:类加载器 它是加载代理对象的字节码文件,和被代理对象使用相同的类加载器,固定写法。
* class[]:字节码数组。 它是用于代理对象和被代理对象有相同的方法,也是固定写法。
* InvocationHandler: 用于增强代码
Proxy.newProxyInstance(类加载起(被代理的接口),
类集合(被代理的接口),
new InvocationHandler() {
/**
* 作用:执行被代理对象的任何接口方法都会经过该方法
* @param proxy 代理对象的引用
* @param method 当前执行的方法
* @param args 当前方法所需要的参数
* @return 和被代理对象的返回值
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//增强的代码:
......
return ;
}
});
2.子类代理
*创建代理对象的要求:
* 被代理的类不能是最终类。
* create方法的参数:
* class:字节码 指定被代理的字节码
* callback: 用于增强代码
Enhancer.create(子类的字节码文件, new MethodInterceptor() {
/**
* 被代理对象都会经过该方法
* @param proxy
* @param method
* @param args
* @param methodProxy
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
//增强的代码:
.......
return ;
}
});