Java动态代理
通过对目标类进行代理,扩展出更多操作
2种动态代理实现方式
Jdk动态代理的目标对象,需要有实现接口,否则只能使用Cglib动态代理,核心:InvocationHandler接口,Proxy类
Cglib动态代理,目标对象不需要有实现接口,可通过目标对象.class对象,生成子代理对象。通过继承方式做动态代理,private 和final修饰的类不能实现Cglib代理。核心:MethodInterceptor接口,Enhancer类
JDK代理比CGLIB代理执行速度快,但性能不如CGLIB
JDK动态代理
一 步骤
- 实现InvocationHandler接口,定义动态代理类
- 对invoke()方法进行修改
- 返回一个代理对象
二 实现
package jdkactiveproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 该动态代理为JDK动态代理,JDK动态代理需要代理对象(目标)有实现接口
*/
public class JdkProxy implements InvocationHandler {
// 目标对象
private Rank rank;
//
JdkProxy(Rank rank){
this.rank = rank;
}
// 返回代理对象
public Object getProxy(){
// 使用Proxy对象创建代理对象.
// 1-3参数分别为:任意类的类加载器,目标对象继承接口,InvocationHandler实现类(在此为JdkProxy本身)
return Proxy.newProxyInstance(Host.class.getClassLoader(),rank.getClass().getInterfaces(),this);
}
// 代理对象执行目标方法时,调用此方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("hell执行之前");
// 目标方法执行
Object result = method.invoke(rank,args);
System.out.println("hell执行之后");
return result;
}
public static void main(String[] args) {
// 创建目标方法
Host host = new Host();
// 创建代理类
JdkProxy jdkProxy = new JdkProxy(host);
// 获取代理对象
Rank o = (Rank) jdkProxy.getProxy();
o.hell();
}
}
CGLIB动态代理
<!-- cglib 动态代理所需依赖 -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
<scope>compile</scope>
</dependency>
一 步骤
- 实现MethodInterceptor接口,的代理类
- 重写intercept()方法
- 通过Enhancer类,创建代理子类
二 代码实现
package cglibactiveproxy;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibProxy implements MethodInterceptor {
// 目标对象(被代理对象)
private Target target;
// 代理对象执行方法时,会调用该方法,在被代理对象前后作代理
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("hello方法执行前");
// 代理对象执行方法
Object result = method.invoke(target,objects);
System.out.println("hello方法执行后");
return result;
}
// 获取代理对象
private Object getProxy(Object target){
this.target = (Target) target;
Enhancer enhancer = new Enhancer();
// 根据目标对象的class类,生成该类的代理子类
enhancer.setSuperclass(target.getClass());
// 回调; 实现MethodInterceptor的类放入其中
enhancer.setCallback(this);
// 创建并返回代理对象
return enhancer.create();
}
public static void main(String[] args) {
// 创建目标对象
Target target = new Target();
// 创建代理类
CglibProxy cglibProxy = new CglibProxy();
// 生成代理对象
Target proxy = (Target) cglibProxy.getProxy(target);
// 代理对象执行方法
proxy.hello("wanggui");
}
}