AOP(JDK动态代理实现)

简介: 采用JDK动态代理实现AOP必须要使代理类和被代理类实现同一个接口

1、采用JDK动态代理须知

(1)采用JDK动态代理实现AOP必须要使代理类和被代理类实现同一个接口。

2345_image_file_copy_420.jpg

(2)代理类实现接口的方式是通过反射在内存中形成,然后在通过类加载器加载到方法区的。所以和我们平时通过implement进行实现的编写方式不一样,但底层原理一样。

(3)我们最后调用方法时是调用代理类实现的方法,而代理类中的方法又调用了被代理类的方法。

2、场景模拟

(1)定义一个接口名称为TaergetInterface,里面有一个方法f(int x,int y),该方法用于计算两数之和并输出。

(2)编写一个类实现这个接口,并实现这个方法f(int x,int y)。

(3)在每次调用f(int x,int y)方法时,在该方法的输出语句前后随便BB几句。

3、代码编写

(1)定义一个接口名称为TaergetInterface,里面有一个方法f(int x,int y),该方法用于计算两数之和并输出。

/**
 * @author 齐天大圣
 * @Version 1.0
 */
public interface TaergetInterface {
    public void f(int x,int y);
}

(2)编写一个类实现这个接口,并实现这个方法f(int x,int y)。

/**
 * @author 齐天大圣
 * @Version 1.0
 */
public class Target implements TaergetInterface{
    @Override
    public void f(int x,int y) {
        System.out.println("x+y="+(x+y));
    }
}

(3)在每次调用f(int x,int y)方法时,在该方法的输出语句前后随便BB几句。

/**
 * @author 齐天大圣
 * @Version 1.0
 */
public class JDKProxy {
    public static void main(String[] args) {
        Target target = new Target();
        ClassLoader classLoader = JDKProxy.class.getClassLoader();
        TaergetInterface proxyInstance = (TaergetInterface)Proxy.newProxyInstance(classLoader, new Class[]{TaergetInterface.class}, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("我在调用方法的前面随便BB");
                method.invoke(target, args);
                System.out.println("我在调用方法的后面随便BB");
                return null;
            }
        });
        proxyInstance.f(7,8);
    }
}

输出结果

2345_image_file_copy_421.jpg

4、代码说明(参数意义)

TaergetInterface接口:就是一个接口

Target类:就是一个实现了TaergetInterface接口的类

上述就完成了两大部分

2345_image_file_copy_422.jpg

接下来就该说一下代理类了。

(1)Proxy.newProxyInstance(参数1,参数2,参数3)

            该函数就是用来创建代理类的,该函数的反回值就是代理类。

2345_image_file_copy_423.jpg

2345_image_file_copy_424.jpg

(2)参数1

            类加载器,就是将我们动态在内存中生成的代理类加载到方法区的。

2345_image_file_copy_425.jpg

(3)参数2

            上面说过代理类需要实现接口,这个地方的参数就是接口。

2345_image_file_copy_426.jpg

(4)参数3

既然代理类已经实现了接口,当然要实现其中的方法,这个参数就是用来写参数的内容的。

参数为InvocationHandle形式传输,它是一个接口,我们可以采用匿名类的方式实现其中的方法。

2345_image_file_copy_427.jpg

可以看到它只有一个方法

public Object invoke(Object proxy, Method method, Object[] args)

当我们使用代理类调用接口中定义的方法时,其实就会调用到invoke方法。

(5)proxy:创建成功的代理类对象。

            jdk底层自动传入该参数,不用我们管。

(6)method:正在执行的方法对象(就是代理类现在正在执行哪个方法)。

2345_image_file_copy_428.jpg

(7)args:代理类执行方法时传入的参数。

2345_image_file_copy_429.jpg

(8)invoke的方法体

2345_image_file_copy_430.jpg

(9)method.invoke(target, args)

我们平时都是通过 对象.方法(参数)进行调用方法的//通过对象找方法

这里是通过 方法.反射(被代理对象,参数)来调用的//通过方法找对象,因为代理类执行的方法就是被代理类要执行的方法

2345_image_file_copy_431.jpg

(10)整体流程

2345_image_file_copy_432.jpg

相关文章
|
2月前
|
监控 Java 开发者
Spring AOP动态代理
Spring AOP动态代理
62 1
|
19天前
|
XML Java 数据格式
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
15 0
|
20天前
|
设计模式 Java 程序员
java动态代理(JDK和cglib)
java动态代理(JDK和cglib)
10 0
|
23天前
|
设计模式 Java 程序员
java动态代理(JDK和cglib)
java动态代理(JDK和cglib)
15 0
|
23天前
|
缓存 Java Maven
JDK 动态代理
JDK 动态代理
8 0
|
28天前
|
Java Spring
深入解析Spring源码,揭示JDK动态代理的工作原理。
深入解析Spring源码,揭示JDK动态代理的工作原理。
22 0
|
2月前
|
设计模式 Java
JDK动态代理
JDK动态代理
|
2月前
|
Java 程序员 API
浅谈JDK动态代理
浅谈JDK动态代理
51 1
|
2月前
|
设计模式 Java API
[Java]静态代理、动态代理(基于JDK1.8)
本篇文章主要是对静态代理和动态代理实现思路的简述,以示例为主,少涉及理论。 如果文中阐述不全或不对的,多多交流。
66 1
[Java]静态代理、动态代理(基于JDK1.8)
|
2月前
|
设计模式 安全 Java
深入理解Spring Boot AOP:CGLIB代理与JDK动态代理的完全指南
深入理解Spring Boot AOP:CGLIB代理与JDK动态代理的完全指南
803 1