zoukankan      html  css  js  c++  java
  • 手写aop

    package com.demo;
    
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    
    // 测试接口和类
    interface Waiter {
        //服务方法
        public void server();
    }
    
    class ManWaiter implements Waiter {
    
        @Override
        public void server() {
            System.out.println("服务中");
        }
    }
    
    // aop框架
    interface BeforeAdvice {
        public void before();
    }
    
    interface AfterAdvice {
        public void after();
    }
    
    
    /**
     * @author sunwenfei
     * @date 2021-08-13 14:00
     */
    public class ProxyFactory {
    
        private Object targetObject;//目标对象
        private BeforeAdvice beforeAdvice;//前值增强
        private AfterAdvice afterAdvice;//后置增强
    
        public Object getTargetObject() {
            return targetObject;
        }
    
        public void setTargetObject(Object targetObject) {
            this.targetObject = targetObject;
        }
    
        public BeforeAdvice getBeforeAdvice() {
            return beforeAdvice;
        }
    
        public void setBeforeAdvice(BeforeAdvice beforeAdvice) {
            this.beforeAdvice = beforeAdvice;
        }
    
        public AfterAdvice getAfterAdvice() {
            return afterAdvice;
        }
    
        public void setAfterAdvice(AfterAdvice afterAdvice) {
            this.afterAdvice = afterAdvice;
        }
    
        /**
         * 用来生成代理对象
         * @return
         */
        public Object creatProxy() {
            /**
             * 给出三个参数
             */
            ClassLoader classLoader = this.getClass().getClassLoader();
            //获取当前类型所实现的所有接口类型
            Class[] interfaces = targetObject.getClass().getInterfaces();
    
            InvocationHandler invocationHandler = new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    /**
                     * 在调用代理对象的方法时,会执行这里的内容
                     */
                    if(beforeAdvice != null) {
                        beforeAdvice.before();
                    }
                    Object result = method.invoke(targetObject, args);//调用目标对象的目标方法
                    //执行后续增强
                    afterAdvice.after();
    
                    //返回目标对象的返回值
                    return result;
                }
            };
            /**
             * 2、得到代理对象
             */
            Object proxyObject = Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
            return proxyObject;
    
        }
    
        public static void main(String[] args) {
    
            ProxyFactory proxyFactory = new ProxyFactory();//创建工厂
            proxyFactory.setTargetObject(new ManWaiter());//设置目标对象
            //设置前置增强
            proxyFactory.setBeforeAdvice(new BeforeAdvice() {
                @Override
                public void before() {
                    System.out.println("客户你好");
                }
            });
            //设置后置增强
            proxyFactory.setAfterAdvice(new AfterAdvice() {
                @Override
                public void after() {
                    System.out.println("客户再见");
                }
            });
            Waiter waiter = (Waiter) proxyFactory.creatProxy();
            waiter.server();
        }
    }
    

      https://zhuanlan.zhihu.com/p/37732577

  • 相关阅读:
    《敏捷开发修炼之道》学习笔记3:交付用户想要的软件
    Photoshop快捷键大集合
    如何制作已编译的HTML帮助文件(即CHM帮助文件)
    根本不存在 DIV + CSS 布局这回事
    可将视频转换成Gif动画的相关软件
    SEO是什么?与spam有什么区别呢?
    视频六大编辑软件大比拼
    陈彤:一个网络编辑的11年
    最近出现的p2psvr.exe恶意程序的解决办法
    使用火狐浏览器Firefox的一些小技巧
  • 原文地址:https://www.cnblogs.com/iamswf/p/15137187.html
Copyright © 2011-2022 走看看