动态代理之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修饰输出的做对比:

 

posted @ 2019-10-31 14:56  风中之烛_清  阅读(164)  评论(0编辑  收藏  举报