1.编译期(预处理),用的是apt,通过编译器javac的-processor参数,指定注解预处理类,对程序进行修改。
这个时期可以做的事情,可以通过解析原程序生成的抽象语法树(AST)来创建新的源程序。
日本比较有名的orm框架doma2用的就是这种方法,比如自动实例化Dao interface生成实例化后的源文件。
也可以对抽象语法数(AST)进行修改,编译成新的class。
Lombok就是这样做的。
可以参照这个网页看看Lombok的运行原理
https://my.oschina.net/wangmengjun/blog/821976
2.编译期,这个必须用自定义的编译器,而不是标准的javac。
自定义的编译器里,会根据额外的配置和处理,把一个java源文件编译成一个增强了的类文件。
aspectj的ctw模式用的就是这个方法
3.类加载,用的是javaagent,通过java的-javaagent参数,指定代理类,在加载类的时候,对类进行动态修改。
由于类加载的时候,就完成了修改,所以不管以什么方式创建实例的时候,用的都是修改后的类
aspectj的ltw模式就是用的这个方法
4.创建实例,这里不能用new关键字去创建了,一般是通过一个类容器来创建,容器里对再对类进行改造,创建一个代理类(有interface的时候)的实例,或者创建一个子类(没有interface的时候)的实例。也就是说实际上类的实例已经不是原来那个类的了。
spring的proxy模式用的就是这个方法
相关推荐
在学习Java程序设计的过程中,首次接触编程通常是从编写经典的"Hello, World!"程序开始。这个简单的程序旨在帮助初学者熟悉开发环境和基本语法。本作业主要涵盖了以下几个核心知识点: 1. **安装Java开发工具**:...
2. 跨平台:Java程序通过JVM运行,JVM为不同操作系统提供了兼容层,使得Java程序无需修改即可在Windows、Linux、Mac OS等平台上运行。 3. 安全性:Java有严格的类型检查和安全沙箱机制,防止恶意代码对系统造成损害...
现代JVM中的垃圾回收器能够智能地选择合适的时机执行回收操作,减少对应用程序性能的影响。 #### GC调优 GC调优主要包括调整堆大小、设置合适的年轻代和老年代比例、选择合适的垃圾回收器等。合理配置可以显著提升...
Java英文面试题目大全 Java英文面试题目大全是涵盖了基本上面的Java英文面试题目和答案的集合,本文将详细解释每...本文总结了Java英文面试题目的答案,并对每个问题进行了详细解释,帮助读者更好地理解Java基础知识。
下面将对这些技术进行详细讲解。 首先,ActiveMQ是一个开源的消息中间件,用于在分布式系统中实现异步通信和解耦。通过创建生产者和消费者模型,ActiveMQ可以处理大量并发消息,确保系统的稳定性和可扩展性。在实际...
垃圾回收线程独立于应用程序运行,回收时机不可预测。 4. 线程同步:Java提供了多种同步机制,如`synchronized`关键字、wait/notify/notifyAll方法、Lock接口(ReentrantLock、Condition等)、Semaphore信号量、...
4. JAVA程序中如何实现访问权限控制? Java提供了访问控制修饰符来实现访问权限控制,访问控制修饰符分为两类:访问修饰符和非访问修饰符。访问控制修饰符对应的权限控制的大小情况为:public > protected > ...
在深入学习和使用这个JAVA小程序之前,用户需要具备一定的Java编程基础,以便理解和修改源代码。同时,对于艾宾浩斯遗忘曲线的理解也是必要的,因为这将有助于用户更好地利用系统,优化自己的学习过程。总的来说,这...
在Java程序中,`java.lang.OutOfMemoryError: Java heap space` 是一个常见的错误,意味着程序在运行过程中耗尽了JVM分配的堆内存。这个错误通常发生在创建大量对象或者单个对象占用过多内存时。 一、问题描述与...
Java虚拟机(JVM)是Java语言的 runtime 环境,它提供了一个平台独立的环境,使得Java程序可以跨平台运行。JVM 的主要组件包括虚拟机栈、堆、方法区、程序计数器、本地方法栈等。 1. 虚拟机栈(Java Stack) 虚拟机...
Java中的类加载器是JVM(Java虚拟机)的核心组件之一,它们负责将.java源代码编译成的.class字节码文件加载到JVM中,从而使得程序能够运行。类加载器不仅涉及到程序的正常执行,还与Java的动态加载、模块化系统以及...
1. Java Hello World程序让我们了解Java程序的基本结构和执行流程,它是学习Java的第一步。 2. 构建自定义Java库涉及类路径设置和包的使用,是实现代码复用和封装的重要步骤。 3. Java类的加载和初始化时机是理解...
在这个游戏中,`Thread`用于创建独立的执行线程,使得游戏的逻辑(例如坦克移动、射击、碰撞检测等)与用户界面的更新可以并行进行,避免了程序阻塞,提高了用户体验。开发者需要理解如何创建和管理线程,以及如何...
在Java Application中,main方法是程序的入口点,它的定义格式如下: ```java public static void main(String[] args) ``` 这里的`void`表示main方法没有返回值。因此,正确答案是D、void。 2. **函数重载...
Java 字节码是 JVM 可执行的中间表示,允许在不修改原始源代码的情况下进行代码插入和修改。运行时验证利用这种能力,通过在运行时检查程序行为是否符合预定义的规范,以确保软件的正确性和安全性。 1.3 控制流分析...
Java 是一种广泛使用的编程语言,尤其在企业级应用开发中占据主导地位。为了在面试中脱颖而出,理解并掌握Java的基础知识、Spring框架以及Ajax技术至关重要。以下是对这些知识点的详细阐述: 1. **Java 平台版本**...
- JRE(Java Runtime Environment):仅包含运行Java程序所必需的类库和JVM,用于运行已编译的Java程序。 **配置环境变量**: - JAVA_HOME:指向JDK的安装路径。 - PATH:添加JDK的bin目录,使得系统能在任何地方...
- **解析**: 程序中可以抛出Java预定义的各种异常类对象,例如 `Exception` 或者 `RuntimeException` 的实例,而不仅仅限于自定义异常。 14. **由于URL对象对应的Internet地址可以划分为“协议名”、“端口号”和...