• 动态代理模式


    1 日志代理

    实现方式 1 实现接口 jdk动态代理    2 继承  Cglib、Javassist 动态代理

    java的动态代理 -> python的装饰器  -> golang和python函数的闭包 

    package com.itstaredu.spring.aop.before;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.util.Arrays;
    
    /**
     * @author lubai
     * @version 1.0
     * @date 2019/12/10 12:43 下午
     * <p>
     * 1 proxy 所用动态代理类的父类 生产代理类 或代理对象
     * <p>
     * 3 getProxyClass 获取代理类的Class对象
     * 4 newProxyInstance 生成代理类的实例对象
     * <p>
     * 2 invocationHandler 动态代理 具体的处理的内容编写 即 附加功能
     * <p>
     * 代理的目标是谁 获取代理对象 代理里面扩展的功能
     **/
    public class ArithmeticCalculatorProxy {
        /**
         * 目标对象
         */
        private ArithmeticCalculator target;
    
        public ArithmeticCalculatorProxy(ArithmeticCalculator target) {
            this.target = target;
        }
    
        public Object getProxy() {
            /**
             * loader ClassLoader对象 类加载器对象 帮助我们动态生成类
             */
            ClassLoader loader = target.getClass().getClassLoader();
            Class<?>[] interfaces = target.getClass().getInterfaces();
            Object proxy = Proxy.newProxyInstance(loader, interfaces, 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("the method start with" + method.getName() + Arrays.asList(args));
                    Object result = method.invoke(target, args);
                    System.out.println("the method" + method.getName() + "end with" + result);
                    return result;
                }
            });
            return proxy;
        }
    }
    

      

  • 相关阅读:
    java保留字
    12个不可不知的Sublime Text应用技巧和诀窍
    人生准则
    基于Android 的蓝牙A2DP 功能的实现
    蓝牙协议栈详解
    我的2015计划
    今日学习
    滤波器介绍
    STLINK V2安装使用详解
    javascript闭包
  • 原文地址:https://www.cnblogs.com/liubosong/p/12016186.html
Copyright © 2020-2023  润新知