这个东西其实是第三方的,理论要导jar包 ,但是呢 ,Spring 在后面直接集成了他 ,你可以在源码找到。
我们现在用这玩意来写动态代理:
先导入 Spring的gav
第一步 直接新建一个 增强类:【你爱弄不弄...】
package com.bihu.cglib; public class EnhanceMethod { public void before(){ System.out.println("前置增强..."); } public void after(){ System.out.println("后置增强..."); } }
第二步 新建一个目标类
package com.bihu.cglib; import com.bihu.TargetInterface; public class Target implements TargetInterface { @Override public void method() { System.out.println("method Running·····"); } }
第三步 直接新建一个测试类【里面写创建代理对象的方法】
package com.bihu.cglib; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class AgentTest { public static void main(final String[] args) { final Target target = new Target(); final EnhanceMethod enhanceMethod = new EnhanceMethod(); // 1 .创建增强器 final Enhancer enhancer = new Enhancer(); // 2 .设置父类(目标) enhancer.setSuperclass(Target.class); // 3 .设置回调[这里其实你可以实现这个接口 然后传个this进去] enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object o, Method method, Object[] object, MethodProxy methodProxy) throws Throwable { //增强前置 enhanceMethod.before(); //执行方法 Object invoke = method.invoke(target, object); //增强后置 enhanceMethod.after(); return invoke; } }); // 4 .创建代理对象[为什么用Target 我们说过了 它类似于复制 嘿嘿...] Target proxy = (Target) enhancer.create(); //5.直接调用即可 proxy.method(); } }
其实这个比较容易
当然写法你可以去降低耦合 就是实现接口 MethodInterceptor 来直接写,然后呢创建代理对象直接用传参的方法【即 把 测试类封装】。
其实仔细看一点都不难 主要是那些东西是这样的就是这样的。。。。
原文:https://www.cnblogs.com/bi-hu/p/15032851.html