动态代理的原理

ε祈祈猫儿з 提交于 2020-02-06 05:23:17
1、定义一个接口   2、定义一个类来实现该接口    3、使用proxy来动态获取对象的方法,并通过三种不同的方法来增强实体对象的方法(参数增强,返回值增强,方法体增强)package cn.hopetesting.proxy;/** * @author newcityman * @date 2019/9/13 - 15:22 */public interface SaleComputer {    public String sale(double money);    public void show();}
package cn.hopetesting.proxy;/** * @author newcityman * @date 2019/9/13 - 15:24 */public class lenovo implements SaleComputer {    @Override    public String sale(double money) {        System.out.println("花了"+money+"元买了一台联想电脑.....");        return "联想电脑";    }    @Override    public void show() {        System.out.println("炫耀电脑");    }}
package cn.hopetesting.proxy;import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * @author newcityman * @date 2019/9/13 - 15:34 */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 proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {            /**             *             * @param proxy   代理对象             * @param method  代理对象调用的方法,被封装为对象             * @param args    代理对象条用的方法时,传递的实际参数             * @return             * @throws Throwable             */            @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]);*/                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("免费送货。。。。。");                    //增强返回值                    obj = obj +"_移动硬盘";                    return obj;                } else {                    Object obj = method.invoke(lenovo, args);                    return obj;                }            }        });        //2、调用方法        String computer = proxy_lenovo.sale(5000);        System.out.println(computer);       /* proxy_lenovo.show();*/    }}
 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!