zoukankan      html  css  js  c++  java
  • cgkib动态代理详解-不依赖接口,速度快

    1. cglib原理-不依赖接口,速度快

    使用ASM字节框架动态生成要代理类的子类,子类重写final以外的方法,织入横切逻辑

    2. 示例-实现MethodInterceptor

    Test.java
    public class Test {
        public  void sayHello(String ss){
            System.out.println(ss);
        }
    }
    
    TargetInterceptor.java
    public class TargetInterceptor implements MethodInterceptor {
        public  Object getInstance(Object source){
            Enhancer enhancer = new Enhancer();
            //设置父类
            enhancer.setSuperclass(source.getClass());
            //设置回调方法
            enhancer.setCallback(this);
            //创建代理对象
            return enhancer.create();
        }
    
        /**
         * 重写方法拦截在方法前和方法后加入业务
         * Object obj为目标对象
         * Method method为目标方法
         * Object[] params 为参数,
         * MethodProxy proxy CGlib方法代理对象
         */
        public Object intercept(Object obj, Method method, Object[] params,
                                MethodProxy proxy) throws Throwable {
            System.out.println("调用前");
            Object result = proxy.invokeSuper(obj, params);
            System.out.println(" 调用后"+result);
            return result;
        }
    
        public static void main(String[] args) {
            Test test = new Test();
            Test proxy = (Test)new TargetInterceptor().getInstance(test);
            System.out.println("proxy类型:"+proxy.getClass().getName());
            proxy.sayHello("zzzzzzz");
        }
    }
    

    执行结果

    proxy类型:test.java.cglibtest.Test$$EnhancerByCGLIB$$6926e63
    调用前
    zzzzzzz
     调用后null
    
  • 相关阅读:
    JSP中9大内置对象类型
    使用JSP/Servalet技术开发新闻发布系统------JSP数据交互一
    BZOJ5306: [Haoi2018]染色
    BZOJ4695: 最假女选手
    BZOJ4355: Play with sequence
    BZOJ3771: Triple
    BZOJ4057: [Cerc2012]Kingdoms
    BZOJ3302: [Shoi2005]树的双中心
    BZOJ4036: [HAOI2015]按位或
    12.24 ~ 12.30周训练计划+总结
  • 原文地址:https://www.cnblogs.com/Desneo/p/7255842.html
Copyright © 2011-2022 走看看