使用动态代理来对原方法进行增强
首先创建一个Productor类用于测试,
public class ProductorImpl implements Productor { public void sale(Double money) { System.out.println("厂家:"+money); } public void afterSale(Double money) { System.out.println("代理商:"+money); } }
用CGLib动态代理来进行增强
package com.mine.proxy; import java.lang.reflect.Method; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; public class CglibProxyTest { public static void main(String[] args) { //创建子类对象 final ProductorImpl pr = new ProductorImpl(); /** * 用Enhance类来进行增强 * create方法 * 参数 * 1.类的获取 * 2.callback 的子接口 MethodInterceptor * */ ProductorImpl pro = (ProductorImpl)Enhancer.create(pr.getClass(), new MethodInterceptor() { /** * 用来进行增强 * MethodProxy 被代理对象 */ public Object intercept(Object arg0, Method method, Object[] arg2, MethodProxy arg3) throws Throwable { Object returnValue = null; if("sale".equals(method.getName())) { double m = (Double)arg2[0]; returnValue=method.invoke(pr, m/2); } return returnValue; } }); pro.sale(1000.0); } }
用JDK动态代理进行增强
package com.mine.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class JdkProxyTest { public static void main(String[] args) { final ProductorImpl productor = new ProductorImpl(); /** * 实现jdk动态代理技术 使用反射方法 生成代理对象 * 1.通过proxy这个类中newProxyInstance() * 参数: * 1)实现类的ClassLoader * 2)实现类的接口 * 3)创建InvocationHandler * */ Productor pro = (Productor)Proxy.newProxyInstance(productor.getClass().getClassLoader(), productor.getClass().getInterfaces(), new InvocationHandler() { //这个方法就是用来增强内容的方法 /** * proxy代理对象 * method执行方法 * args获取到的执行方法需要传递的参数 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object returnValue = null; if("sale".equals(method.getName())) { Double money = (Double) args[0]; returnValue = method.invoke(productor, money*0.8); } return returnValue; } }); pro.sale(10000.0); } }
反射的原理暂时还是似懂非懂的感觉,而运用则比较好理解,就是给出方法名和类名,通过代理找到类和方法去执行,在接下来Spring AOP的学习中,反射也是需要前置学习的部分,不需要完全掌握,但要大抵知道是怎么运作的。
原文:https://www.cnblogs.com/HJYDR/p/12382813.html