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中对程序进行修改的时机。)