package com.item.designpattern; /** * 1.真实类 */ public class Lenovo implements SaleComputer { @Override public String sale(double money) { System.out.println("客户花了"+money+"买了一台电脑!"); return "联想电脑"; } @Override public void show() { System.out.println("展示电脑"); } }
package com.item.designpattern; public interface SaleComputer { public String sale(double money); public void show(); }
package com.item.designpattern; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * 1.代理测试类 */ public class ProxyTest { public static void main(String[] args) { /** * 1.创建真实对象 * 2.动态代理增强lenovo对象 * 2.1类加载器,真实对象.getClass().getClassLoader() * 2.2接口数组 真实对象.getClass().getInterfaces() * 2.3处理器 new InvocationHandler() * 3.调用方法 */ Lenovo lenovo = new Lenovo(); SaleComputer proxyLenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() { /** * 1.代理逻辑进行编写的方法 * 2.代理对象调用所有的方法都会触发该方法的执行 * 3.invoke(Object proxy, Method method, Object[] args)的三个参数 * 3.1 proxy:代理对象(其实指的是proxyLenovo) * 3.2 method:代理对象调用的方法被封装为的对象 * 3.3 args: 代理对象调用的方法时,实际传递的参数 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { /* System.out.println("该方法执行了!"); System.out.println(method.getName()); System.out.println(args[0]);*/ /** * 1.增强参数 * 2.判断是否是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("免费送货..."); //增强返回值类型 return obj+"_1200多送一个鼠标垫"; } else { Object obj = method.invoke(lenovo, args); return obj; } } }); String computer = proxyLenovo.sale(8000); System.out.println(computer); /* proxyLenovo.show();*/ } }