java动态代理--cglib
2015-08-27 16:15
423 查看
cglib的优点:
1. 性能高。CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用Java反射效率要高。
2. 无需实现接口。Java通过java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler实现的动态代理必须实现接口,但现实中往往是没有接口的。
代码:
1. 随意定义一个类。
start=1440662005592
Tank is start firing...
end=1440662005605
time spent :13 null
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
相关文章推荐
- JVM内存管理:深入Java内存区域与OOM
- JAVA array,map 转 json 字符串
- Selenium 出现: Caused by: java.lang.ClassNotFoundException: org.w3c.dom.ElementTraversal
- Selenium 出现: Caused by: java.lang.ClassNotFoundException: org.w3c.dom.ElementTraversal
- JAVA模板 大整数模板 高精度
- Ehcache 分布式缓存 -springMVC
- JAVA并发编程8_线程池的使用
- 【java】定时器 Timer和TimerTask类
- JAVA并发编程8_线程池的使用
- Eclipse自动编译NDK/JNI的三种方法
- java8 时间操作
- Android Eclipse导入Android Sample详解
- java中创建静态常量键值对Map
- 历史上关于struts2 遍历Map最全的总结
- Java实现zip压缩多个文件下载
- java javassist使用实例
- java如何下载一些自己需要的jar/Class 文件?
- Java数组
- Java核心编程开发
- SSH框架中 Spring设置定时器 Quartz