• 13. Spring—AOP—JDK 的动态代理


    JDK 的动态代理

    因为他是基于接口的 我看书上说他其实是如果有接口默认就上JDK动态代理了,我们实现以下:

    【听说学个之前要有JDK代理模式的基础 我就不 直接淦就完了!】

    什么包都不用导

    新建一个目标接口:

    package com.bihu;
    
    public interface TargetInterface {
        public void method();
    }

    新建一个目标对象 (被增强) 且 继承目标接口:

    package com.bihu;
    
    public class Target implements TargetInterface{
        @Override
        public void method() {
            System.out.println("method Running·····");
        }
    }

    再来一个增强(相当被抽取的那个)方法:

    package com.bihu;
    
    public class Enhance {
        public void before(){
            System.out.println("前置增强...");
        }
    
        public void after(){
            System.out.println("后置增强...");
        }
    }

    再来一个测试的 即调用类:

    package com.bihu;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class AgentTest {
    
        public static void main(String[] args) {
    
            //new 一个 目标对象
              final Target target = new Target();
            //new 一个 增强对象
            final Enhance enhance = new Enhance();
    
    
            /**
             *     public static Object newProxyInstance(ClassLoader loader,
             *                                           Class<?>[] interfaces,
             *                                           InvocationHandler h)
             *     三个参数啊:
             *     第一个 目标对象类加载器
             *     第二个 目标对象相同的接口字节码对象数组
             *     第三个 一个接口 下面演示直接用匿名函数
             */
    
            TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    /**
                     * 其实调用代理对象任何的方法 实质最后还是执行这个 invoke 方法。
                     *              这里三个参数, 第一个是proxy -代理实例;第二个是 method代理实例的 方法实例;第三个是 args -包含在方法上通过代理实例调用的实参的值对象的数组,或 null如果接口方法不需要参数
                     */
                    //执行增强方法(前)
                    enhance.before();
                    Object invoke = method.invoke(target, args);//执行目标方法
                    //执行增强方法(后)
                    enhance.after();
                    return invoke;
                }
            });
    
            //调用测试 //主要是这里往里看比较容易懂
            proxy.method();
        }
    }

    这里慢慢看 即可看懂,有些没学过 但是呢 道理都一样

    本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/15030444.html

  • 相关阅读:
    Java-Scanner
    Java-Stream File IO
    Java-方法
    Java-日期 正则表达式
    Java-数组
    Java-Character String StringBuffer StringBuilder
    Bootstrap栅格系统
    canvas-nest.js 设置网页背景
    Oracle数据库与MySQL的不同点
    java oop第15章_Socket网络编程
  • 原文地址:https://www.cnblogs.com/bi-hu/p/15030444.html
Copyright © 2020-2023  润新知