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

相关文章
|
7天前
|
监控 Java API
JDK动态代理和CGLIB动态代理
Java动态代理允许在运行时创建代理对象,增强或拦截目标类方法的执行。主要通过两种方式实现:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口,利用`java.lang.reflect.Proxy`类和`InvocationHandler`接口;CGLIB则通过字节码技术生成目标类的子类作为代理,适用于未实现接口的类。两者均用于在方法执行前后添加额外逻辑,如日志记录、权限控制等,广泛应用于AOP框架中。
|
15天前
|
监控 Java API
JDK动态代理和CGLIB动态代理
Java动态代理允许在运行时创建代理对象,增强或拦截目标类的方法调用,无需修改原代码。它有两种主要实现方式:JDK动态代理和CGLIB动态代理。 - **JDK动态代理**:通过`java.lang.reflect.Proxy`类和`InvocationHandler`接口实现,适用于实现了接口的类。它在方法调用前后插入额外逻辑,如日志记录、权限控制等。 - **CGLIB动态代理**:基于字节码技术,为未实现接口的类生成子类作为代理,重写父类方法以添加增强逻辑。适用于没有接口的类,但要求目标类不能是`final`类或方法。
|
1月前
|
Java API 数据安全/隐私保护
探索Java动态代理的奥秘:JDK vs CGLIB
动态代理是一种在 运行时动态生成代理类的技术,无需手动编写代理类代码。它通过拦截目标方法的调用,实现对核心逻辑的 无侵入式增强(如日志、事务、权限控制等)。
57 0
探索Java动态代理的奥秘:JDK vs CGLIB
|
1月前
|
XML 安全 Java
Spring AOP—深入动态代理 万字详解(通俗易懂)
Spring 第四节 AOP——动态代理 万字详解!
91 24
|
4月前
|
Java 开发者 Spring
Spring AOP深度解析:探秘动态代理与增强逻辑
Spring框架中的AOP(Aspect-Oriented Programming,面向切面编程)功能为开发者提供了一种强大的工具,用以将横切关注点(如日志、事务管理等)与业务逻辑分离。本文将深入探讨Spring AOP的底层原理,包括动态代理机制和增强逻辑的实现。
87 4
|
4月前
|
安全 Java 开发者
AOP中的JDK动态代理与CGLIB动态代理:深度解析与实战模拟
【11月更文挑战第21天】面向切面编程(AOP,Aspect-Oriented Programming)是一种编程范式,它通过将横切关注点(cross-cutting concerns)与业务逻辑分离,以提高代码的可维护性和可重用性。在Java开发中,AOP的实现离不开动态代理技术,其中JDK动态代理和CGLIB动态代理是两种常用的方式。本文将从背景、历史、功能点、业务场景、底层逻辑等多个维度,深度解析这两种代理方式的区别,并通过Java示例进行模拟和比较。
208 5
|
5月前
|
Java Spring 数据库连接
[Java]代理模式
本文介绍了代理模式及其分类,包括静态代理和动态代理。静态代理分为面向接口和面向继承两种形式,分别通过手动创建代理类实现;动态代理则利用反射技术,在运行时动态创建代理对象,分为JDK动态代理和Cglib动态代理。文中通过具体代码示例详细讲解了各种代理模式的实现方式和应用场景。
92 0
[Java]代理模式
|
5月前
|
Java
【编程进阶知识】静态代理、JDK动态代理及Cglib动态代理各自存在的缺点及代码示例
本文介绍了三种Java代理模式:静态代理、JDK动态代理和Cglib动态代理。静态代理针对特定接口或对象,需手动编码实现;JDK动态代理通过反射机制实现,适用于所有接口;Cglib动态代理则基于字节码技术,无需接口支持,但需引入外部库。每种方法各有优缺点,选择时应根据具体需求考虑。
55 1
|
6月前
|
设计模式 Java 测试技术
spring复习04,静态代理动态代理,AOP
这篇文章讲解了Java代理模式的相关知识,包括静态代理和动态代理(JDK动态代理和CGLIB),以及AOP(面向切面编程)的概念和在Spring框架中的应用。文章还提供了详细的示例代码,演示了如何使用Spring AOP进行方法增强和代理对象的创建。
spring复习04,静态代理动态代理,AOP
|
7月前
|
开发者 C# 容器
【独家揭秘】当WPF邂逅DirectX:看这两个技术如何联手打造令人惊艳的高性能图形渲染体验,从环境搭建到代码实践,一步步教你成为图形编程高手
【8月更文挑战第31天】本文通过代码示例详细介绍了如何在WPF应用中集成DirectX以实现高性能图形渲染。首先创建WPF项目并使用SharpDX作为桥梁,然后在XAML中定义承载DirectX内容的容器。接着,通过C#代码初始化DirectX环境,设置渲染逻辑,并在WPF窗口中绘制图形。此方法适用于从简单2D到复杂3D场景的各种图形处理需求,为WPF开发者提供了高性能图形渲染的技术支持和实践指导。
477 0