`
weiqingfei
  • 浏览: 318163 次
  • 性别: Icon_minigender_1
  • 来自: 黑洞
社区版块
存档分类
最新评论

java中对程序进行修改的时机。

    博客分类:
  • Java
 
阅读更多

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程序设计第1次作业1

    在学习Java程序设计的过程中,首次接触编程通常是从编写经典的"Hello, World!"程序开始。这个简单的程序旨在帮助初学者熟悉开发环境和基本语法。本作业主要涵盖了以下几个核心知识点: 1. **安装Java开发工具**:...

    [Online]Java_and_The_Java_Virtual_Machine.zip

    2. 跨平台:Java程序通过JVM运行,JVM为不同操作系统提供了兼容层,使得Java程序无需修改即可在Windows、Linux、Mac OS等平台上运行。 3. 安全性:Java有严格的类型检查和安全沙箱机制,防止恶意代码对系统造成损害...

    高级Java经典面试题2019

    现代JVM中的垃圾回收器能够智能地选择合适的时机执行回收操作,减少对应用程序性能的影响。 #### GC调优 GC调优主要包括调整堆大小、设置合适的年轻代和老年代比例、选择合适的垃圾回收器等。合理配置可以显著提升...

    Java英文面试题目

    Java英文面试题目大全 Java英文面试题目大全是涵盖了基本上面的Java英文面试题目和答案的集合,本文将详细解释每...本文总结了Java英文面试题目的答案,并对每个问题进行了详细解释,帮助读者更好地理解Java基础知识。

    java实用工具实例

    下面将对这些技术进行详细讲解。 首先,ActiveMQ是一个开源的消息中间件,用于在分布式系统中实现异步通信和解耦。通过创建生产者和消费者模型,ActiveMQ可以处理大量并发消息,确保系统的稳定性和可扩展性。在实际...

    JAVA面试题资料汇总及答案整理.pdf

    垃圾回收线程独立于应用程序运行,回收时机不可预测。 4. 线程同步:Java提供了多种同步机制,如`synchronized`关键字、wait/notify/notifyAll方法、Lock接口(ReentrantLock、Condition等)、Semaphore信号量、...

    JAVA问答题.docx

    4. JAVA程序中如何实现访问权限控制? Java提供了访问控制修饰符来实现访问权限控制,访问控制修饰符分为两类:访问修饰符和非访问修饰符。访问控制修饰符对应的权限控制的大小情况为:public > protected > ...

    JAVA小程序

    在深入学习和使用这个JAVA小程序之前,用户需要具备一定的Java编程基础,以便理解和修改源代码。同时,对于艾宾浩斯遗忘曲线的理解也是必要的,因为这将有助于用户更好地利用系统,优化自己的学习过程。总的来说,这...

    java面试之吸星大法

    在Java中,异常处理是一种重要的机制,用于管理程序运行时可能遇到的错误。当程序违反了Java的语义规则,如数组下标越界、访问null对象等,Java虚拟机会触发异常。这些异常都是`java.lang.Throwable`类的子类,分为...

    记录java.lang.OutOfMemoryErrorJava heap space的情况.docx

    在Java程序中,`java.lang.OutOfMemoryError: Java heap space` 是一个常见的错误,意味着程序在运行过程中耗尽了JVM分配的堆内存。这个错误通常发生在创建大量对象或者单个对象占用过多内存时。 一、问题描述与...

    浅谈JAVA虚拟机JVM及工作原理

    Java虚拟机(JVM)是Java语言的 runtime 环境,它提供了一个平台独立的环境,使得Java程序可以跨平台运行。JVM 的主要组件包括虚拟机栈、堆、方法区、程序计数器、本地方法栈等。 1. 虚拟机栈(Java Stack) 虚拟机...

    类加载器(java)

    Java中的类加载器是JVM(Java虚拟机)的核心组件之一,它们负责将.java源代码编译成的.class字节码文件加载到JVM中,从而使得程序能够运行。类加载器不仅涉及到程序的正常执行,还与Java的动态加载、模块化系统以及...

    Java相关基础

    1. Java Hello World程序让我们了解Java程序的基本结构和执行流程,它是学习Java的第一步。 2. 构建自定义Java库涉及类路径设置和包的使用,是实现代码复用和封装的重要步骤。 3. Java类的加载和初始化时机是理解...

    java 坦克大战

    在这个游戏中,`Thread`用于创建独立的执行线程,使得游戏的逻辑(例如坦克移动、射击、碰撞检测等)与用户界面的更新可以并行进行,避免了程序阻塞,提高了用户体验。开发者需要理解如何创建和管理线程,以及如何...

    北方工业Java复习题.doc

    在Java Application中,main方法是程序的入口点,它的定义格式如下: ```java public static void main(String[] args) ``` 这里的`void`表示main方法没有返回值。因此,正确答案是D、void。 2. **函数重载...

    用于Java程序的高效且有表现力的字节码级指令插入_Efficient and Expressive Bytecode-Leve

    Java 字节码是 JVM 可执行的中间表示,允许在不修改原始源代码的情况下进行代码插入和修改。运行时验证利用这种能力,通过在运行时检查程序行为是否符合预定义的规范,以确保软件的正确性和安全性。 1.3 控制流分析...

    JAVA 面试题整理.doc

    Java 是一种广泛使用的编程语言,尤其在企业级应用开发中占据主导地位。为了在面试中脱颖而出,理解并掌握Java的基础知识、Spring框架以及Ajax技术至关重要。以下是对这些知识点的详细阐述: 1. **Java 平台版本**...

    java基础知识总结

    - JRE(Java Runtime Environment):仅包含运行Java程序所必需的类库和JVM,用于运行已编译的Java程序。 **配置环境变量**: - JAVA_HOME:指向JDK的安装路径。 - PATH:添加JDK的bin目录,使得系统能在任何地方...

    高级程序员java考试题库及答案解析

    - **解析**: 程序中可以抛出Java预定义的各种异常类对象,例如 `Exception` 或者 `RuntimeException` 的实例,而不仅仅限于自定义异常。 14. **由于URL对象对应的Internet地址可以划分为“协议名”、“端口号”和...

Global site tag (gtag.js) - Google Analytics