在使用CGLB代理需要实现MethodInterceptor接口
public interface MethodInterceptor extends Callback { Object intercept(Object var1, Method var2, Object[] var3, MethodProxy var4) throws Throwable; }
里面只有一个方法intercept。
需要说明的是。CGLB不需要接口(有无接口都可以),但是jdk动态代理必须要接口,以下是使用cglb代理的过程
先定义一个类
package org.buptdavid.datastructure.zj.cglbProxy; public class Hello { public void sayHello() { System.out.println("Hello zhanghao!"); } }
再创建一个代理类CGLBProxy实现MethodInterceptor,如下:
package org.buptdavid.datastructure.zj.cglbProxy; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * @author jiezhou * @CalssName: CGLBProxy * @Package org.buptdavid.datastructure.zj.cglbProxy * @Description: * @date 2020/6/6/14:58 */ public class CGLBProxy implements MethodInterceptor{ private Object target; public Object getInstance(Object target){ this.target=target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass()); //回调方法 enhancer.setCallback(this); //创建代理对象 return enhancer.create(); } //回调方法 @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("wo shi CGLB de dong tai daili " ); //反射方法 前调用 System.out.println("before ---> invokesuper()"); Object retureObject = methodProxy.invokeSuper(o, objects); //反射方法后调用 System.out.println("after ---> invokesuper()"); return retureObject; } }
测试(使用debug调试):
package org.buptdavid.datastructure.zj.cglbProxy; /** * @author jiezhou * @CalssName: Test * @Package org.buptdavid.datastructure.zj.cglbProxy * @Description: * @date 2020/6/6/15:06 */ public class Test { @org.junit.Test public void test(){ Hello hello = new Hello(); Hello proxyInstance = (Hello) new CGLBProxy().getInstance(hello); proxyInstance.sayHello(); } }
运行结果:
图中可以看出是CGLBProxy代理,target是Hello