zoukankan      html  css  js  c++  java
  • cglib动态代理

    cglib实现原理:生成被代理对象的子类,使用ASM字节码技术重组来重写父类(被代理对象)的方法。生成的这个新对象,可以强制转换为被代理对象。也就是子类引用赋值给父类!

    案例编写:

    1. 导入cglib依赖包

      <dependencies>
        <!-- https://mvnrepository.com/artifact/cglib/cglib -->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2.2</version>
        </dependency>
      </dependencies>

    2. 实现cglib动态代理类

    import java.lang.reflect.Method;
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    public class MyCglibProxy implements MethodInterceptor{
        
        /**
         * @param clazz   被代理的类
         */
        public Object getInstance(Class clazz) throws Exception{
            //1. 创建字节码增强器,用来对被代理的类扩展。
            Enhancer enhancer = new Enhancer();
            //2. 告诉cglib,生成的子类需要继承那个父类。
            enhancer.setSuperclass(clazz);
            //3. 设置回调
            enhancer.setCallback(this);
            //4. 生成源代码,编译成class文件,加载到jvm,并返回代理对象。
             Object obj = enhancer.create();
             return obj;
        }
        /**
         * @param obj    生成的子类  
         * @param method 被拦截的方法
         * @param args   被拦截方法的参数
         * @param proxy  触发父类的方法对象
         */
        @Override
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
            System.out.println("正在进行挑选 ... ");
            proxy.invokeSuper(obj, args);
            System.out.println("包裹已发出,正在派送中!");
            return null;
        }
    }

    3. 创建被代理类

    public class Clothes {
        public void buyClothes() {
            System.out.println("我要买衣服");
        }
    }
    
    
    public class Computer {
        public void buyComputer() {
            System.out.println("我要买电脑");
        }
    }

    4. 测试

    public class Test {
    
        public static void main(String[] args) {
            try {
                Clothes obj = (Clothes)new MyCglibProxy().getInstance(Clothes.class);
                obj.buyClothes();
                System.out.println("====================");
                Computer obj2 = (Computer)new MyCglibProxy().getInstance(Computer.class);
                obj2.buyComputer();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    ==================
    【控制台输出】
            正在进行挑选 ... 
            我要买衣服
            包裹已发出,正在派送中!
            ====================
            正在进行挑选 ... 
            我要买电脑
            包裹已发出,正在派送中!
               
  • 相关阅读:
    createDocumentFragment 文档碎片提升dom增删的性能
    微信小程序引入外部js 方法
    javascript 阻止事件冒泡 cancelBubble
    javascript event事件兼容性处理
    SVN地址正确,能在网页打开,但是检出失败解决方法
    使用a标签下载文件,而不是直接打开,使用属性 download
    java 获取项目根目录
    ajax 提交所有表单内容及上传图片(文件),以及单独上传某个图片(文件)
    Vim命令图解和XVim使用
    解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题
  • 原文地址:https://www.cnblogs.com/wlwl/p/10034059.html
Copyright © 2011-2022 走看看