• 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代理

          

  • 相关阅读:
    被刷登录接口
    移动端布局方案
    容易遗忘的Javascript点
    java 笔记02
    java 笔记01
    C# 日常整理
    reac-native 0.61开发环境
    DOS命令收集
    vue整理日常。
    php7.1+apache2.4.x+mysql5.7安装配置(目前windows)
  • 原文地址:https://www.cnblogs.com/csong7876/p/7851424.html
Copyright © 2020-2023  润新知