简述代理设置的模式种类 如何使用代理ip( 二 )


2.2、cglib动态代理
举个例子:
2.2.1、创建一个老师即将要来了的类:
publicclassTeacher{ publicvoidmove(){ System.out.println(\"Teacher is coming。。。。。\"); } }
2.2.2、创建cglib代理的实现类:
importorg.springframework.cglib.proxy.Enhancer; importorg.springframework.cglib.proxy.MethodInterceptor; importorg.springframework.cglib.proxy.MethodProxy; importjava.lang.reflect.Method; /** * 基于spring的cglib的继承式 动态代理,*/publicclassCglibDynamicProxy implementsMethodInterceptor { privateEnhancer enhancer = newEnhancer(); publicObjectgetProxy(Class clazz) { enhancer.setSuperclass(clazz); enhancer.setCallback(this); returnenhancer.create(); } /** * 拦截所有目标类方法的调用 * 参数: * obj目标实例对象 * method 目标方法的反射对象 * args方法的参数 * proxy代理类的实例 */@OverridepublicObjectintercept(Objecto, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println(\"cglib 动态代理之老师还没来 。。。。\"); methodProxy.invokeSuper(o,objects); System.out.println(\"cglib 动态代理之老师已经来了 。。。。\"); returnnull; } }
2.2.3、创建测试类:
publicclassTestCglibDynamicProxy{ publicstaticvoidmain(String[] args){ CglibDynamicProxy cglibDynamicProxy = newCglibDynamicProxy(); Teacher train = (Teacher) cglibDynamicProxy.getProxy(Teacher.class); train.move(); } }
总结:

  • 动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理 。
  • 在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样对每一个方法或方法组合进行处理 。
  • 不过JDK的Proxy仅支持 interface 代理 。Java 的单继承机制注定了这些动态代理类们无法实现对 class 的动态代理 。
  • 好在Spring有cglib为实现了class类的动态代理 。典型应用:AOP编程

  • 简述代理设置的模式种类 如何使用代理ip

    文章插图
    【简述代理设置的模式种类 如何使用代理ip】三种代理方式对比