咱们还是根据媒婆介绍单身青年相亲的例子用CGLIB动态代理来实现:
// 首先还是先创建单身青年类
public class CGLibCustomer {
// 同样写findLove防范, 注意: 这次不是实现接口方法,而是这个类自己的方法
public void findLove(){
System.out.println("肤白貌美大长腿");
}
}
// 媒婆类 实现MethodInterceptor这个接口
public class CGLibMeipo implements MethodInterceptor {
public Object getInstance(Class<?> clazz) throws Exception {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
before();
Object obj = methodProxy.invokeSuper(o, objects);
after();
return obj;
}
private void before() {
System.out.println("我是媒婆:我要给你找对象,我现在已经确定你的需求了");
System.out.println("开始物色");
}
private void after() {
System.out.println("如果可以就结婚");
}
}
测试代码:
public static void main(String[] args) {
try {
CGLibCustomer obj = (CGLibCustomer) new CGLibMeipo().getInstance(CGLibCustomer.class);
obj.findLove();
} catch (Exception e) {
e.printStackTrace();
}
}
运行结果:
我是媒婆:我要给你找对象,我现在已经确定你的需求了
开始物色
肤白貌美大长腿
如果可以就结婚
CGLIB动态代理和JDK动态代理的区别:
- JDK代理实现了被代理类的接口,而CGLIB代理集成了被代理类
- CGLIB代理和JDK代理都是在运行时期动态生成字节码,CGLIB代理生成代理类会比JDK代理生成代理类效率更低一些
3.CGLIB动态代理是FastClass机制直接调用方法的,执行效率会更高一些