cglib代理

前面讲的 静态代理和动态代理(JDK代理) 中目标对象都有实现的接口,如果一个类中没有实现的接口,我们想要对其功能进行扩展,不妨考虑使用cglib代理实现

---Cglib子类代理采用了底层的字节码技术,在内存中动态的构建一个子类对象  。。所以使用cglib子类代理时候,目标对象不能是final 否则无法继承。。

在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势植入横切逻辑(Jdk动态代理和cglib代理是实现Spring AOP的基础)


普通类Student

1 package cn.secol.cglib_proxy;
2 
3 public class Student {
4     public void learn(){
5         System.out.println("day day up ");
6     }
7 }

代理工厂ProxyFactory

 1 package cn.secol.cglib_proxy;
 2 
 3 import java.lang.reflect.Method;
 4 
 5 import net.sf.cglib.proxy.Enhancer;
 6 import net.sf.cglib.proxy.MethodInterceptor;
 7 import net.sf.cglib.proxy.MethodProxy;
 8 
 9 public class ProxyFactory implements MethodInterceptor {
10     //维护一个目标对象
11     private Object target;
12 
13     public ProxyFactory(Object target) {
14         this.target = target;
15     }
16     
17     //利用工具类Enhander得到代理对象
18     public Object getProxyInstance(){
19         //工具类
20         Enhancer en = new Enhancer();
21         //设置父类
22         en.setSuperclass(target.getClass());
23         //回调函数
24         en.setCallback(this);
25         //创建子类代理对象
26         return en.create();
27     }
28 
29     @Override
30     public Object intercept(Object obj, Method method, Object[] arg, MethodProxy proxy) throws Throwable {
31         
32         System.out.println("处理前....");
33         Object returnValue = method.invoke(target, arg);
34         System.out.println("处理后....");
35         
36         return returnValue;
37     }
38     
39      
40 }

 测试类以及结果:

package cn.secol.cglib_proxy;

import org.junit.Test;

/**
 * 测试类
 * @author Administrator
 *
 */
public class TestDemo {
    
    @Test
    public void fun1(){
        //创建目标对象
        Student stu = new Student();
        //创建代理对象
        Student proxy =  (Student) new ProxyFactory(stu).getProxyInstance();
        System.out.println(proxy.getClass());
        proxy.learn();
    }
}





class cn.secol.cglib_proxy.Student$$EnhancerByCGLIB$$8f67ef7c
处理前....
day day up 
处理后....

 总结:1.使用cglib需要引入cglib-jar文件  2.cglib代理的目标对象不能用final修饰,否则报错

   **在Spring AOP编程中  如果目标对象有实现接口,用动态jdk代理  如果目标对象没用实现接口,用cglib代理

      

原文地址:https://www.cnblogs.com/csong7876/p/7851424.html