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

    cglib的优点:

      1. 性能高。CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用Java反射效率要高。

      2. 无需实现接口。Java通过java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler实现的动态代理必须实现接口,但现实中往往是没有接口的。

    代码:

      1. 随意定义一个类。  

    package pr.cgl.cglib;

    /**
    * Created by LL on 2015/8/27.
    */
    public class Tank {
    public void move(){
    System.out.println("Tank is moving...");
    }
    public void action(){
    System.out.println("Tank is start firing...");
    }
    }
    2. 实现  
    package pr.cgl.cglib;

    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    import java.lang.reflect.Method;
    /**
    * Created by LL on 2015/8/27.
    */
    public class CglibProxy implements MethodInterceptor {

    //要代理的原始对象
    private Object obj;

    public Object createProxy(Object target) {
    this.obj = target;
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(target.getClass());// 设置代理目标
    enhancer.setCallback(new CglibProxy());// 设置回调
    enhancer.setClassLoader(target.getClass().getClassLoader());
    return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
    Long start = System.currentTimeMillis();
    System.out.println("start="+start);
    Object result = methodProxy.invokeSuper(o, objects);
    Long end = System.currentTimeMillis();
    System.out.println("end="+end);
    System.out.println("time spent :"+((end - start))+" "+result);
    return result;
    }
    }
    3. 测试 
    package pr.cgl.cglib;

    /**
    * Created by LL on 2015/8/27.
    */
    public class Test3 {
    public static void main(String[] args) {
    Tank tank = new Tank();
    CglibProxy proxy = new CglibProxy();
    Tank t = (Tank)proxy.createProxy(tank);
    t.action();
    }

    }
    输出:

      start=1440662005592
      Tank is start firing...
      end=1440662005605
      time spent :13 null

  • 相关阅读:
    ie不支持 event.stopPropagation 的解决方式
    jquery 获取 元素.text( ) 里面的值 需要进行去空格去换行符操作
    使用插件实现某元素展示特定行文字,超出显示...
    css文字超出显示省略号
    纯css实现各种三角形图案
    jQuery判断鼠标是否在某个元素内
    z-tree相关设置
    js提取字符串中的汉字
    扩展ie中不兼容的startsWith,endsWith方法
    获取浏览器URL携带过来的参数/获取url中"?"符后的字串
  • 原文地址:https://www.cnblogs.com/cglWorkBook/p/4763656.html
Copyright © 2011-2022 走看看