CGLIB动态代理是基于类继承的代理, 不能被继承的方法也不能被代理, 比如final, private修饰的方法.
CGLIB中重要的两个概念:
MethodInterceptor是方法拦截器, 代理类只需要实现该接口, 并实现intercept方法. intercept方法是代理真正调用的方法, 在这个方法里可以获取被代理类的信息并调用被代理类的方法.
Enhancer是增强器, 需要传入被代理类对象和拦截器对象(就是实现类了MethodInterceptor的类), 之后可以创建代理类对象.
现在有一个房东:
public class Host2 {
public void rent() {
System.out.println("房东要把房子租出去");
}
}
一个通用的拦截器:
public class ProxyInterceptor implements MethodInterceptor {
private Object target;
public Object getInstance(Object target) {
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.target.getClass());
// 回调方法, 下面的intercept方法就是这里调用的,所以需要代理类本身的对象
enhancer.setCallback(this);
// 创建代理类对象
return enhancer.create();
}
// Object ob 被代理类的对象
// Method method 被拦截的方法
// Object[] objects 被拦截的方法的参数
// MethodProxy methodProxy 用来调用父类的方法
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
this.seeHouse();
Object returnObj = methodProxy.invokeSuper(o, objects);
this.hetong();
return returnObj;
}
private void seeHouse() {
System.out.println("中介带看房子");
}
private void hetong() {
System.out.println("签合同");
}
}
测试:
Host2 host2 = new Host2();
ProxyInterceptor proxyInterceptor = new ProxyInterceptor();
Host2 instance = (Host2)proxyInterceptor.getInstance(host2);
instance.rent();
测试结果:
中介带看房子
房东要把房子租出去
签合同
标签:target,Object,代理,Host2,CGLIB,动态,方法,public
From: https://www.cnblogs.com/yuandaguangming/p/17123089.html