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

相关文章
|
5月前
|
Java
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
这篇文章是Spring5框架的实战教程,深入讲解了AOP的基本概念、如何利用动态代理实现AOP,特别是通过JDK动态代理机制在不修改源代码的情况下为业务逻辑添加新功能,降低代码耦合度,并通过具体代码示例演示了JDK动态代理的实现过程。
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
|
2月前
|
Java 开发者 Spring
Spring AOP深度解析:探秘动态代理与增强逻辑
Spring框架中的AOP(Aspect-Oriented Programming,面向切面编程)功能为开发者提供了一种强大的工具,用以将横切关注点(如日志、事务管理等)与业务逻辑分离。本文将深入探讨Spring AOP的底层原理,包括动态代理机制和增强逻辑的实现。
49 4
|
2月前
|
安全 Java 开发者
AOP中的JDK动态代理与CGLIB动态代理:深度解析与实战模拟
【11月更文挑战第21天】面向切面编程(AOP,Aspect-Oriented Programming)是一种编程范式,它通过将横切关注点(cross-cutting concerns)与业务逻辑分离,以提高代码的可维护性和可重用性。在Java开发中,AOP的实现离不开动态代理技术,其中JDK动态代理和CGLIB动态代理是两种常用的方式。本文将从背景、历史、功能点、业务场景、底层逻辑等多个维度,深度解析这两种代理方式的区别,并通过Java示例进行模拟和比较。
77 5
|
3月前
|
Java Spring 数据库连接
[Java]代理模式
本文介绍了代理模式及其分类,包括静态代理和动态代理。静态代理分为面向接口和面向继承两种形式,分别通过手动创建代理类实现;动态代理则利用反射技术,在运行时动态创建代理对象,分为JDK动态代理和Cglib动态代理。文中通过具体代码示例详细讲解了各种代理模式的实现方式和应用场景。
45 0
[Java]代理模式
|
4月前
|
设计模式 Java 测试技术
spring复习04,静态代理动态代理,AOP
这篇文章讲解了Java代理模式的相关知识,包括静态代理和动态代理(JDK动态代理和CGLIB),以及AOP(面向切面编程)的概念和在Spring框架中的应用。文章还提供了详细的示例代码,演示了如何使用Spring AOP进行方法增强和代理对象的创建。
spring复习04,静态代理动态代理,AOP
|
3月前
|
Java
【编程进阶知识】静态代理、JDK动态代理及Cglib动态代理各自存在的缺点及代码示例
本文介绍了三种Java代理模式:静态代理、JDK动态代理和Cglib动态代理。静态代理针对特定接口或对象,需手动编码实现;JDK动态代理通过反射机制实现,适用于所有接口;Cglib动态代理则基于字节码技术,无需接口支持,但需引入外部库。每种方法各有优缺点,选择时应根据具体需求考虑。
28 1
|
5月前
|
Java API 开发者
Jdk动态代理为啥不能代理Class?
该文章主要介绍了JDK动态代理的原理以及为何JDK动态代理不能代理Class。
Jdk动态代理为啥不能代理Class?
|
5月前
|
开发者 C# 容器
【独家揭秘】当WPF邂逅DirectX:看这两个技术如何联手打造令人惊艳的高性能图形渲染体验,从环境搭建到代码实践,一步步教你成为图形编程高手
【8月更文挑战第31天】本文通过代码示例详细介绍了如何在WPF应用中集成DirectX以实现高性能图形渲染。首先创建WPF项目并使用SharpDX作为桥梁,然后在XAML中定义承载DirectX内容的容器。接着,通过C#代码初始化DirectX环境,设置渲染逻辑,并在WPF窗口中绘制图形。此方法适用于从简单2D到复杂3D场景的各种图形处理需求,为WPF开发者提供了高性能图形渲染的技术支持和实践指导。
326 0
|
5月前
|
设计模式 Java C++
揭秘!JDK动态代理VS CGLIB:一场关于Java代理界的‘宫心计’,你站哪队?
【8月更文挑战第24天】Java 动态代理是一种设计模式,允许在不改动原类的基础上通过代理类扩展功能。主要实现方式包括 JDK 动态代理和 CGLIB。前者基于接口,利用反射机制在运行时创建代理类;后者采用继承方式并通过字节码技术生成子类实现类的代理。两者在实现机制、性能及适用场景上有明显差异。JDK 动态代理适用于有接口的场景,而 CGLIB 更适合代理未实现接口的类,尽管性能更优但存在一些限制。开发者可根据需求选择合适的代理方式。
218 0
|
4月前
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
AOP(面向切面编程)能够帮助我们在不修改现有代码的前提下,为应用程序添加新的功能或行为。Micronaut框架中的AOP模块通过动态代理机制实现了这一目标。AOP将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高模块化程度。在Micronaut中,带有特定注解的类会在启动时生成代理对象,在运行时拦截方法调用并执行额外逻辑。例如,可以通过创建切面类并在目标类上添加注解来记录方法调用信息,从而在不侵入原有代码的情况下增强应用功能,提高代码的可维护性和可扩展性。
84 1