• 动态代理之cglib


    代理是通过构造一个和委托类有同样行为的对象,cglib代理是通过字节码技术来生成一个继承该委托类的一个代理类。代理类重写包含委托对象中所有方法(除private修饰的不能继承)。 注:可以使用代理类调用final,static修饰的方法,但是代理类中没有重写该方法,所以会调用委托类中的该方法(增强的代码不会执行)。

    委托类:

     1 package com.proxy.dynamicProxy;
     2 
     3 public class Sang {
     4      public void dance(){
     5          
     6          System.out.println("Sang中 start dance");
     7      }
     8      
     9      
    10      public static void sayStatic(){
    11          System.out.println("Sang中 static方法");
    12      }
    13      
    14      public final void sayFianl(){
    15          System.out.println("Sang中 final方法");
    16      }
    17      
    18      private  void sayprivate(){
    19          System.out.println("Sang中 private方法");
    20      }
    21 }
    View Code

    代理类:

     1 package com.proxy.dynamicProxy;
     2 import java.lang.reflect.Method;
     3 import net.sf.cglib.proxy.Enhancer;
     4 import net.sf.cglib.proxy.MethodInterceptor;
     5 import net.sf.cglib.proxy.MethodProxy;
     6 /**
     7  * cglib可传入接口或实现类
     8  * static,private final修饰的方法
     9  * 不能代理final修饰的类
    10  * @author 
    11  *
    12  */
    13 public class CglibDynamciProxy implements MethodInterceptor{
    14     public Object createProxyObj(Class<?> clz){
    15         Enhancer enhancer = new Enhancer(); // 为代理类指定需要代理的类,也即是父类
    16         enhancer.setSuperclass(clz);  // new 一个新的方法拦截器
    17        enhancer.setCallback(this);  //获取动态代理类对象并返回
    18        return enhancer.create();  // 创建cglib 代理类 end                 
    19     }
    20 
    21     @Override
    22     public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
    23         System.out.println("cglib代理intercept:方法"+arg1.getName());
    24         //不能使用invoke(),InvokeSuper是增强过的。
    25         return arg3.invokeSuper(arg0, arg2);
    26     }
    27 }
    View Code

    测试类:

    1 @Test
    2     public void test2(){
    3         CglibDynamciProxy cg = new CglibDynamciProxy();
    4         Sang sa= (Sang) cg.createProxyObj(Sang.class);
    5         //sa.dance();
    6         //sa.sayFianl();
    7       // sa.sayStatic();
    8         //sa.sayprivate();   调用不出来                
    9     }
    View Code

    结果1:

     正常方法(非final,static修饰)

        

    2、final修饰的:

      

    3、static:和fianl一样

       

    4、private修饰(继承不了)和static修饰输出的做对比:

  • 相关阅读:
    存储过程示例
    对话:关于委托的进一步讨论(转)
    Oracle SQLServer 的随机数问题 .(转)
    AJAX控件之AutoComplete
    穷人与富人的区别
    喜欢(转)
    用sql求得每行行号
    ajax 注册
    如何快速生成100万不重复的8位编号 (转)
    存儲過程的基本語句
  • 原文地址:https://www.cnblogs.com/swfzzz/p/11771208.html
Copyright © 2020-2023  润新知