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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值