• java动态代理proxy对象,对数据增强


    先定义一个公共的接口

    public interface SalaComputer {
        public abstract String sala(double money);
        public abstract void show();
    }

    一个真实对象

    /**
     * 真实类
     */
    public class Lenovo implements SalaComputer {
        @Override
        public String sala(double money) {
            System.out.println("花了8000元买了一台联想电脑");
            return "联想电脑";
        }
    
        @Override
        public void show() {
            System.out.println("展示电脑.....");
        }
    }

    此处不再演示真实类调用方法了,直接上动态代理

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    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(){}
                        * 要和真实对象保持一致,因为要代理 真实对象
             */
            SalaComputer proxy_lenovo = (SalaComputer)Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {
                /**
                 * 代理逻辑编写的方法,代理对象调用的所有方法都会触发该方法
                 *
                 * 参数含义:(代理对象和真实对象是一样的,只是对真实对象进行了增强,调用的还是真实对象的方法,参数)
                     *  * Object proxy:就是真实对象,
                     *  * Method method:调用的方法
                     *  * Object[] args:所传递的参数
                 *  返回值,就是所调方法经过增强后的返回值
                 */
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    System.out.println("该方法被执行了...");
                    //判断是否是sala方法
                    if(method.getName().equals("sala")){
                        //z增强参数
                        double money = (double) args[0];
                        money = money * 0.85;
                        System.out.println("专车接你......");
                        //使用 真实对象调用方法
                        String invoke = (String)method.invoke(lenovo, money);
                        System.out.println("免费送货.........");
                        //增强返回值
                        return invoke+"_鼠标垫";
                    }else{
                        Object obj = method.invoke(lenovo, args);
                        return obj;
                    }
    
                }
            });
            //3.调用方法
            String computer = proxy_lenovo.sala(8000);
            System.out.println(computer);
            proxy_lenovo.show();
        }
    }

    执行结果

    增强servlet的request

  • 相关阅读:
    OO第四次总结
    OO第三次总结
    C语言函数指针
    Java对象集合
    emacs下最牛逼的Markdown编辑方式
    OO第二次总结
    Git复习
    Java设计原则
    多线程学习笔记1
    OO第一次总结
  • 原文地址:https://www.cnblogs.com/bozhengheng/p/12225802.html
Copyright © 2020-2023  润新知