动态代理2—增强方法
动态代理
方法定义三要素:
1、返回值类型 2、方法名 3、参数列表
方法执行三要素:
1、方法参数 2、方法返回值 3、方法具体实现的业务逻辑
代理对象增强的方式:
1、增强参数列表 2、增强返回值 3、增强方法体执行逻辑
功能增强
package cn.itcast.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * @Desc TODO * @Author wzx * @Date 2020/11/15 17:20 */ public class ProxyTest { public static void main(String[] args) { //1、创建真实对象 Lenovo lenovo = new Lenovo(); //2、动态代理增强lenovo对象 /** * 三个参数: * 1、类加载器:真实对象.getClass().getClassLoader() * 2、接口数组:真实对象.getClass().getInterfaces() * 3、处理器:new InvocationHandler() */ //转为接口类型(真实类对象和代理对象都实现了 SaleComputer) SaleComputer proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() { /** * 代理逻辑编写的方法: 代理对象调用的所有方法都会都会触发该方法执行 * 增强代码的逻辑就在 invoke方法里面编写 * @param proxy 代理对象 其实就是指的 proxy_lenovo对象 * @param method 代理对象调用的方法,被封装为对象(重要 利用反射封装成Method对象) * @param args 代理对象调用的方法时,传递的实际参数 被封装到Object[] args数组里面 * @return * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { /* System.out.println("该方法执行了"); System.out.println(method.getName()); //sale System.out.println(args[0]);//8000*/ //判断是否是sale方法 if (method.getName().equals("sale")) { //1、增强参数 double money = (double) args[0]; money = money * 0.85; //增强方法体执行逻辑 System.out.println("专车接你...."); //使用真实对象调用改方法 String obj = (String) method.invoke(lenovo, money); System.out.println("免费送货...."); //2、增强返回值 return obj+"_鼠标垫"; } else { Object obj = method.invoke(lenovo, args); return obj; } } }); //2、调用方法(使用代理对象调用方法) 不管调用什么方法 invoke方法都会被执行 //String computer = lenovo.sale(8000); String computer = proxy_lenovo.sale(8000); System.out.println(computer); //proxy_lenovo.show(); 该方法也会自动调用invoke方法 } }
输出: 专车接你… 花了6800.0元买了一台联想电脑… 免费送货… 联想电脑_鼠标垫