zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    118. Pascal's Triangle
    172. Factorial Trailing Zeroes
    345. Reverse Vowels of a String
    58. Length of Last Word
    383. Ransom Note
    387. First Unique Character in a String
    83. Remove Duplicates from Sorted List
    关于Assembly.CreateInstance()与Activator.CreateInstance()方法
    查看占用指定端口的进程
    如何使用eclipse打开已有工程
  • 原文地址:https://www.cnblogs.com/bozhengheng/p/12225802.html
Copyright © 2011-2022 走看看