`

[JAVA] 重学 JAVA 系列 - 动态代理类

阅读更多
1 名词解释
动态代理类 一个不需要编写的类, 由代码自动生成并加载.
代理接口   需要代理的普通接口
代理实例   代理类的实例
Invocation Handler 代理类的调用处理器
CGLIB 可以创建/修改字节码文件的工具包.

2
重要概念
动态代理类是指运行时创建并加载实现代理接口的类,代理类的实例叫代理实例, 代理实例的方法调用都会分发到实例所持有的Invocation Handler的invoke方法. 因为动态代理类的创建依赖接口,因此通过反射调用是类型安全的,不会调用到非代理接口外的方法.

3 原理
通过动态生成字节码并加载到内存,来实现类的动态加载.理论上可以支持创建任何形式的类.但为了防止代码乱用.业界流行两种方法:
第一种: 使用JAVA的动态代理机制, 这种方法采用实现接口并关联原始类的实例来实现重写原始类的方法.
第二种: 使用第三方包CGLIB等的动态代理机制, 这种方法采用继承的原始类方法来重写重写原始对象的方法.这种方法原理与第一种相同,本文略过.

4 规则
a. 多个接口类必须不同。
b. 多个接口类的方法返回值必须相同。
c. 多个接口类的方法重复时,只使用接口顺序靠前的接口的方法,后面接口的方法忽略。
d. 多个接口类的Object方法,不能重写(代理)。
e. 代理类可实现序列化、反序列化接口。
f. 接口数量最大不能超过65563。
g. 多个接口类为非public接口时,必须属于同一个包。
h. 多个接口类对于ClassLoader都是可见的。
i. 使用同一个ClassLoader与接口列表创建的代理类会缓存,供重复获取时使用。
j. 代理类不要引用ClassLoader,接口类与代理类, 避免垃圾不能回收。
k. 代理类使用InvocationHandler来重写代理方法。

5 场景
a. Spring AOP中的拦截器
b. Hibernate 的延迟加载
c. 日志,权限等代码注入。只需要知道对象。
分享到:
评论

相关推荐

    Java 反射-动态代理

    动态代理是在运行时创建代理类和代理对象,这些代理对象可以代替目标对象执行某些操作,同时提供额外的功能,如日志记录、事务管理等。Java提供两种方式实现动态代理:JDK动态代理和CGLIB代理。 1. JDK动态代理:...

    java 简答可复用动态代理类

    - `Proxy`类是Java提供的动态代理的工厂,它可以根据一个接口生成实现了该接口的代理类的对象。这个代理类会动态地生成并实现接口的所有方法。 - `InvocationHandler`接口定义了一个处理方法调用的回调方法`invoke...

    java事务 - 使用动态代理

    动态代理是Java提供的一种机制,它允许我们在运行时创建一个代理类来代理目标对象,从而在不修改原有代码的情况下,增加额外的功能。在事务管理中,动态代理通常用于实现AOP(面向切面编程),将事务逻辑与业务逻辑...

    java动态代理类的实例

    在Java中,静态代理是通过定义一个与被代理类实现相同接口的新类来实现的,而动态代理则在运行时动态生成此类,无需预先编写代理类的代码。 `java.lang.reflect.Proxy`类是Java动态代理的核心,它提供了创建代理...

    Java动态代理学习测试类

    这个“Java动态代理学习测试类”可以帮助我们理解和实践Java动态代理的原理和使用,进一步提升我们对Java语言特性的掌握。通过实际编写和运行代码,我们可以更直观地看到动态代理如何工作,从而更好地应用到实际项目...

    java-jdk1.6-jdk-6u45-windows-x64.zip

    2. 动态代理:引入了`java.lang.reflect.Proxy`类,使得动态创建代理对象成为可能,便于实现AOP(面向切面编程)。 3. NIO.2:Java 7引入了NIO.2,但1.6版本已经包含了一些改进,如更好的文件系统访问API,异步I/O...

    JAVA类加载机制与动态代理

    - **动态语言支持**:例如使用`java.lang.reflect.Proxy`类来创建动态代理类。 - **自定义代码生成**:通过编写代码来手动生成代理类的字节码。 ##### 2.2 动态代理的概念 动态代理允许我们为一个接口创建一个代理...

    Java 动态代理详解(学习资料)

    在运行时,我们可以动态创建一个实现了特定接口的代理类,从而避免了静态代理的缺点。下面来看看如何使用 JDK 动态代理。首先,我们需要实现 InvocationHandler 接口,这里定义一个 LogInvocationHandler 类public ...

    java动态代理demo

    Java动态代理基于Java反射机制,可以在运行时动态地创建代理类和代理对象。与静态代理(即手动编写代理类)相比,动态代理无需预先为每个接口编写单独的代理类,使得代码更加灵活且易于维护。 2. **代理接口** 在...

    Java实现动态代理

    我们先来看Proxy类,它是Java动态代理的核心,它提供了一种机制,能够基于接口生成代理类的实例。 1. **Proxy类的使用**: - 首先,你需要有一个或多个接口,代理对象会实现这些接口。 - 然后,定义一个...

    664.662.JAVA基础教程_动态代理与Java8新特性-动态代理举例(664).rar

    动态代理主要涉及到Java.lang.reflect包中的两个类:Proxy和InvocationHandler。Proxy类用于创建一个实现了特定接口的代理对象,而InvocationHandler接口则定义了代理对象在方法被调用时的行为。通过这两者结合,...

    java + 动态代理 + 动态代理实际应用场景

    1:静态代理出现的实际背景,静态代理时如何演化成动态代理 2: 动态代理demo 举例实际应用场景(载入数据库驱动的时候,使用AIDL与系统Servic...4: 动态代理使用到基础理论:Class.forName("xxxx") 得到Class类 。

    Java试题-2:ArrayList类动态代理

    Java试题-2:ArrayList类动态代理 什么是动态代理 动态代理该怎么实现

    对代理模式与Java动态代理类的理解

    对代理模式与Java动态代理类的理解说明

    java-design-patterns-master_JAVAdesignpattens_java_design_

    16. **模板方法模式(Template Method Pattern)**:在抽象类中定义了一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 17. **状态模式(State...

    Java代理模式Java动态代理

    ### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...

    java代理机制 JDK动态代理和cglib代理 详解

    本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...

    java 动态代理 完整版

    1. **定义接口**:首先定义一个接口,所有的业务逻辑类和代理类都需要实现这个接口。 2. **实现业务逻辑类**:创建实现该接口的具体业务逻辑类。 3. **实现InvocationHandler接口**:创建一个实现了`...

    java-java面试题库整理-基础-JVM-线程并发-框架等.zip

    - 类与对象:Java是一种面向对象的语言,了解类的定义、构造器、封装、继承和多态是基础。 - 异常处理:学习如何使用try-catch-finally语句块进行异常捕获和处理。 - 内存管理:理解栈内存和堆内存的区别,以及...

    JAVA静态代理和动态代理

    总结来说,Java的静态代理适用于代理类较少且代理逻辑相对固定的情况,而动态代理则在代理类数量不确定或者代理逻辑可能变化时更为合适。两者都可以实现为原始对象添加附加功能,但动态代理在灵活性和代码维护方面...

Global site tag (gtag.js) - Google Analytics