Warm tip: This article is reproduced from serverfault.com, please click

其他-Kotlin中的AOP将在Java类中使用

(其他 - AOP in Kotlin to be used in Java class)

发布于 2020-12-22 17:58:56

我正在Kotlin中实现一个可从Java使用的库。可以在Kotlin中创建注释和AOP代码,然后在Java中使用。

如果可能的话,文档或示例将很棒。我找不到任何具有这种互操作性的东西。

问候。

Questioner
paul
Viewed
11
kriegaex 2020-12-24 14:24:31

至于注释,在Kotlin中实现它应该没有任何问题。

至于方面,当使用Kotlin编译器进行编译时,它将最终成为带有所有必需@AspectJ批注的常规JVM类,但这将不是一个方面,因为它不是由AspectJ编译器编译的,到目前为止,AspectJ编译器还无法理解Java源代码。

  • 如果通过LTW(加载时编织)使用这种“未完成”的方面,则AspectJ编织器可以在加载时将其完成为一个方面,因此该方案应该可以使用。
  • 在尝试将未完成的方面用于针对Java(或Kotlin)目标类的编译时或二进制编织的情况下,有必要使用中间步骤来使用AspectJ编译器完成未完成的方面,但是我从未尝试过,并且没有这样做知道是否有可能。尝试会很有趣。我不会说Kotlin,但是尝试一下,如果你对我有一些像从Maven理想构建的示例项目这样的开始,也许会很有趣。如果有任何方法可以实现,我们最终将以不同的方式使用AspectJ Maven插件,就像建议的@dreamcrash一样。

顺便说一句,我需要你提供更多有关“从Java中使用”的含义的信息。请详细说明。


更新:我只是尝试了一下:

  • Kotlin中的注解和方面
  • 与科特林编译器来编译成我的-aspect.jaraspectjrt.jar类路径
  • 将Kotlin类包装到JAR中
  • 使用Kotlin方面JAR中的注释的Java类
  • 与编译AJC我-aspect.jar的INPATH和aspectjrt.jar科特林-stdlib.jar类路径上。
  • 结果例如在bin目录中,包括Java类和JAR中的两个Kotlin类,但是这次由ajc(比原始文件大的类文件)完成。
  • 运行Java程序与文件夹,aspectjrt.jar科特林-stdlib.jar类路径上。

效果很好,方面也可以发挥作用。

剩下的唯一步骤是将它与AspectJ Maven插件“美化”,这应该相当容易。但是问题的答案是:是的,你可以在Kotlin中实现一个方面,并将其与Java目标类结合使用。当然,缺点是你需要在类路径上使用Kotlin标准库,而不仅仅是像往常一样仅使用AspectJ运行时。


更新2:我为自己和你的方便创建了一个Maven多模块游乐场项目。只需克隆我的GitHub存储库,然后根据自述文件构建并运行即可。