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();
    }
}

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

 

posted @ 2021-07-19 15:36  咸瑜  阅读(61)  评论(0编辑  收藏  举报