Cglib动态代理
在开始之前需要导入包asm-2.2.3.jar 和 cglib-nodep.2.1_3jar在这里可以免费下载http://download.csdn.net/detail/jarremdon/9624537
CGLIB是一个强大的高性能的代码生成包。他弥补了JDK动态代理的缺点就,没有接口也可以使用代理
那就是Cglib动态代理,但是自己有一个局限性,代理的类是可以继承的不能是final类,回顾代理模式
通常是通过接口或者子类继承父类的方式来实现一类加强另一个类
下面以具体的代码为例:
service类package com.tang.CglibProxy; public class service { public String services(){ return "My name is JarremDon"; } }代理类:CglibProxy
package com.tang.CglibProxy; 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 CglibProxy implements MethodInterceptor { //需要代理的原始类 public Object object; public CglibProxy(Object object){ this.object=object; } public Object Proxy(){ //创建加强器 Enhancer enhancer=new Enhancer(); //设置需要加强的类 enhancer.setSuperclass(object.getClass()); //设置回调 enhancer.setCallback(this); enhancer.setClassLoader(object.getClass().getClassLoader()); return enhancer.create(); } @Override public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable { //这里实现加强 Object invoke=arg3.invoke(object, arg2); return invoke.toString().toUpperCase(); } }
测试类:MyTest
package com.tang.CglibProxy; public class MyTest { public static void main(String args[]){ service s=new service(); CglibProxy proxy=new CglibProxy(s); service s1=(service) proxy.Proxy(); System.out.println(s1.services()); } }
CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,
但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,
因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要更为合适一些。同时,
由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理