Java 编译时 AOP 实现

2021-12-17 10:56:52 +08:00
 dk7952638

最近发现了 Dagger 这个编译时 DI 的宝藏项目,发现编译时确实有很多好处 但是 Dagger 并不支持 AOP ,于是对 Java 的编译时 AOP 实现进行了调研 发现如下

Micronaut IOC

https://docs.micronaut.io/latest/guide/index.html#ioc

貌似是通过字节码增强实现的

fastaop

https://github.com/fast-light/fastaop

通过 Lombok 的方式,Annotation Processor 阶段修改 AST 实现

还有其他的实现吗,欢迎补充

1773 次点击
所在节点    问与答
7 条回复
git00ll
2021-12-17 11:17:19 +08:00
java 编译时 aspectj
dk7952638
2021-12-17 11:23:32 +08:00
@git00ll 请问能具体讲讲吗,aspectj 还有编译时的吗?
git00ll
2021-12-17 12:13:26 +08:00
根据配置的连接点,编译时修改原始的 class 文件,
将增强织入原始字节码中,生成增强后的字节码。
这样打成 jar 包后的 class 文件就是增强后的 class 文件了。

这个算是编译时 aop 吧
dk7952638
2021-12-17 12:14:48 +08:00
@git00ll 谢谢,明白了,应该是和 Micronaut 一样的方式
newaccount
2021-12-17 12:47:14 +08:00
AspectJ, 运行期织入( Load Time Weaving, LTW ),编译期织入( Compile Time Weaving, CTW )。以前用来模仿 Active Record 做充血模型的。但是那时候还没有 jenkins ,结果总有人发布的 class 不对,后来也就懒得用了。
dk7952638
2021-12-17 14:05:10 +08:00
@newaccount 我简单看了一下,AspectJ CTW 是通过 AspectJ 自己的编译器(或者是 eclipse 维护的编译器)来嵌入切面代码的,不知道我理解的对不对
newaccount
2021-12-17 17:30:22 +08:00
@dk7952638 是的。而且比起来在代码里面玩花活儿,还是写的让新人容易上手更实在。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/822764

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX