readme
代理模式:真实对象:被代理的对象代理对象:就是代理对象代理模式:代理对象代理真实对象,达到增强真实对象功能目的实现方式:动态代理:1、代理对象和真实对象实现相同的接口2、代理对象 = Proxy.newProxyInstance()3、使用代理对象调用方法4、增强方法增强方式:1、增强参数列表2、增强返回值类型3、增强方法体逻辑
demo-代理商+原厂卖手机
接口
package com.example.newyear.proxy;public interface SalePhone {public String sale(double maney);public void show();}
真实类
package com.example.newyear.proxy;/*** 真实类*/public class lenovo implements SalePhone{@Overridepublic String sale(double maney) {System.out.println("花了"+maney+"买了一台电脑");return "lenove pc";}@Overridepublic void show() {System.out.println("展示电脑....原价8000");}}
代理测试类
package com.example.newyear.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/*** 代理测试类*/public class Proxytest {public static void main(String[] args) {//创建真实对象lenovo lno = new lenovo();//动态代理增强lno对象 底层:反射一个实现相同接口的类,这个新类的方法里面包含了对旧类方法的引用,使用这个新类实例化一个对象// 这个方法会返回一个代理对象// 固定写法 传入lno对象的类加载器和所有接口/*** 三个参数:* 1、类加载器:真实对象.getClass().getClassLoader()* 2、接口数组:真实对象.getClass().getInterfaces() 保证代理对象和真实对象实现了相同的接口* 3、处理器:new InvocationHandler() 核心业务的处理** 因为代理对象和真实对象都是实现SalePhone接口,所以可以直接强转,方便阅读*/SalePhone proxy_lno = (SalePhone) Proxy.newProxyInstance(lno.getClass().getClassLoader(), lno.getClass().getInterfaces(), new InvocationHandler() {/*** 代理逻辑里面写的方法:代理对象调用的所有方法都会触发该方法执行* @param proxy :代理对象,就是上面的proxy_lno* @param method : 代理对象调用哪个方法,就会把哪个方法通过反射封装成对象传入* @param args :代理对象调用的方法时,传递的实际参数* @return* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// System.out.println("代理逻辑中的方法执行了");// System.out.println(method.getName());// System.out.println(args[0]);//代理对象只是增强真实对象的,因此这里面需要使用真实对象调用方法进行执行 而方法已经通过虚拟对象传入method中了//方法被真实对象执行// Object obj = method.invoke(lno, args);//使用真实对象调用方法执行后,返回的结果,这里return是给到代理对象,所以下面的pc=obj// return obj;//上面那部分需要好好理解,可以把注释去掉,运行进行理解,但是记得注释下面这部分//案例:比如供应商(代理对象),代理卖联想的电脑,卖出价格是进价的1.1// 判断是否是sale方法,如果不是sale方法,就不会触发if (method.getName().equals("sale")){//增强参数double maney = (double) args[0];maney = maney*1.1;//增强方法体System.out.println("客户");Object obj = method.invoke(lno, maney);System.out.println("客户血赚");//增强返回值return "因为"+obj+"送了鼠标";}else {Object obj = method.invoke(lno, args);return obj;}}});//使用代理对象调用真实类中的方法String pc = proxy_lno.sale(8000);System.out.println(pc);// proxy_lno.show();}}
通过代理,可以对真实对象进行增强,输出了更多的内容
