动态代理之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 }
代理类:
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 }
测试类:
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 }
结果1:
正常方法(非final,static修饰)
2、final修饰的:
3、static:和fianl一样
4、private修饰(继承不了)和static修饰输出的做对比: