cglib动态代理
就是因为要用到cglib的jar包,所以叫cglib动态代理。
为什么要使用这个cglib来实现这个动态代理呢?因为spring框架要用。
具体的代码实现如下:
目标对象类: package com.sss.designPattern.proxy.dynamicProxy.cglbDynamicProxy; /** * 被代理的类 * 目标对象类 */ public class TargetObject { /** * 目标方法(即目标操作) */ public void business() { System.out.println("business"); } } 拦截器类: package com.sss.designPattern.proxy.dynamicProxy.cglbDynamicProxy; 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 MyInterceptor implements MethodInterceptor { private Object target;//目标类 public MyInterceptor(Object target) { this.target = target; } /** * 返回代理对象 * 具体实现,暂时先不追究。 */ public Object createProxy() { Enhancer enhancer = new Enhancer(); enhancer.setCallback(this);//回调函数 拦截器 //设置代理对象的父类,可以看到代理对象是目标对象的子类。所以这个接口类就可以省略了。 enhancer.setSuperclass(this.target.getClass()); return enhancer.create(); } /** * args 目标方法的参数 * method 目标方法 */ @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("aaaaa");//切面方法a(); //。。。 method.invoke(this.target, objects);//调用目标类的目标方法 //。。。 System.out.println("bbbbb");//切面方法f(); return null; } } 测试类: package com.sss.designPattern.proxy.dynamicProxy.cglbDynamicProxy; public class MainTest { public static void main(String[] args) { //目标对象 TargetObject target = new TargetObject(); //拦截器 MyInterceptor myInterceptor = new MyInterceptor(target); //代理对象,调用cglib系统方法自动生成 //注意:代理类是目标类的子类。 TargetObject proxyObj = (TargetObject) myInterceptor.createProxy(); proxyObj.business(); } }
区别:
首先从文件数上来说,cglib比jdk实现的少了个接口类。因为cglib返回的代理对象是目标对象的子类。而jdk产生的代理对象和目标对象都实现了一个公共接口。
动态代理分为两种:
jdk的动态代理
代理对象和目标对象实现了共同的接口
拦截器必须实现InvocationHanlder接口
cglib的动态代理
代理对象是目标对象的子类
拦截器必须实现MethodInterceptor接口
hibernate中session.load采用的是cglib实现的
参考
https://blog.csdn.net/zcc_0015/article/details/22695647