欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java中对程序进行修改的时机。 博客分类: Java

程序员文章站 2024-03-21 15:19:04
...

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模式用的就是这个方法