1、cglib简述
Cglib是一个优秀的动态代理框架,它的底层使用ASM在内存中动态的生成被代理类的子类,使用CGLIB即使代理类没有实现任何接口也可以实现动态代理功能。CGLIB具有简单易用,它的运行速度要远远快于JDK的Proxy动态代理:
使用CGLIB需要导入以下两个jar文件:
$1: asm.jar – CGLIB的底层实现
$2: cglib.jar – CGLIB的核心jar包。
CGLIB的核心类:
net.sf.cglib.proxy.Enhancer – 主要的增强类
net.sf.cglib.proxy.MethodInterceptor – 主要的方法拦截类,它是Callback接口的子接口,需要用户实现
net.sf.cglib.proxy.MethodProxy – JDK的java.lang.reflect.Method类的代理类,可以方便的实现对源对象方法的调用,如使用:
Object o = methodProxy.invokeSuper(proxy, args);//虽然第一个参数是被代理对象,也不会出现死循环的问题。
2、简单的cglib代理使用前述:Person 类和Dog类都有一个方法叫做avtive(); Dog的avtive()方法来实现自IAnimal接口。
package com.boonya.proxy.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 CglibObjectProxy { @SuppressWarnings("rawtypes") public static Object ceateProxtObject(final Object object,Class clazz) { // 声明增加类实例 Enhancer en = new Enhancer(); // 设置被代理类字节码,CGLIB根据字节码生成被代理类的子类 en.setSuperclass(clazz); // 设置回调函数,即一个方法拦截 en.setCallback(new MethodInterceptor() { @Override public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable { // 注意参数object,仍然为外部声明的源对象,且Method为JDK的Method反射 Object o = method.invoke(object, args); return o; } }); return en.create(); } public static void main(String[] args) { // 未实现接口的类的代理 Person proxyPerson=(Person) CglibObjectProxy.ceateProxtObject(new Person(),Person.class); proxyPerson.active("Talk with sb."); // 实现接口的类的代理 IAnimal proxyDog=(IAnimal) CglibObjectProxy.ceateProxtObject(new Dog(),Dog.class); proxyDog.active("Dog lying ..........."); } }3、优化封装cglib的使用对象
package com.boonya.proxy.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 CglibProxy implements MethodInterceptor { private Object srcTarget; private CglibProxy(Object o) { this.srcTarget = o; } @SuppressWarnings("unchecked") public static <T> T proxyTarget(T t) { Enhancer en = new Enhancer(); en.setSuperclass(t.getClass()); en.setCallback(new CglibProxy(t)); T tt = (T) en.create(); return tt; } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { Object o = method.invoke(srcTarget, args); return o; } public static void main(String[] args) { // 未实现接口的类的代理 Person person = CglibProxy.proxyTarget(new Person()); person.active("Tom speaking ........"); // 实现接口的类的代理 IAnimal dog = CglibProxy.proxyTarget(new Dog()); dog.active("Dog is running........."); } }