cglib动态代理的实现,原理
//被代理类 注意相对于jdk动态代理 cglib不需要一个公共接口-
package com.xyd.cglib;
public class CglibService {
public void say(){
System.out.println("我是被代理的方法 也叫做委托类");
}
}
//实现cglib的接口MethodInterceptor
package com.xyd.cglib;
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 {
Object o;
public Object getInstance(Object targer){
this.o = targer;
//cglib的核心原理 不需要接口,而是继承委托类
Enhancer enhancer = new Enhancer();
//产生目标类的子类
enhancer.setSuperclass(this.o.getClass());
//设置回调方法是MethodInterceptor的实现类
enhancer.setCallback(this);
//实例化我们构建的子类
return enhancer.create();
}
public Object intercept(Object obj,
Method method,
Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("访问控制系统 启动···");
proxy.invokeSuper(obj,args);
System.out.println("你可真能闹儿");
return null;
}
}
//调用代码
package com.xyd.cglib;
public class MainCglib {
public static void main(String[] args) {
CglibService cglibService = new CglibService();
CglibProxy cglibProxy = new CglibProxy();
CglibService cglibSay =
(CglibService)cglibProxy.getInstance(cglibService);
cglibSay.say();
}
}
cglib与jdk代理的区别
用cglib实现代理 被代理类的不需要有接口
原理上的区别就是
cglib是通过继承被代理类来实现的代理
jdk动态代理的原理是通过被代理类获取接口
通过接口在jdk内存中动态生成另一个这接口的实现类