Kotlin 中的 AOP 将用于 Java class

AOP in Kotlin to be used in Java class

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

中使用

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

此致。

注解在Kotlin中实现应该没有问题。

至于方面,当用 Kotlin 编译器编译时,它最终应该是一个普通的 JVM class,带有所有必要的 @AspectJ 注释,但它不会是一个方面,因为它不是由AspectJ 编译器,到今天只理解 Java 源代码。

  • 如果您通过 LTW(加载时编织)使用此类“未完成”方面,AspectJ 编织器可以在加载时将其完成为一个方面,因此该方案应该有效。
  • 在尝试使用未完成的方面进行编译时或二进制编织针对 Java(或 Kotlin)目标 classes 的情况下,使用以下方法完成未完成的方面的中间步骤AspectJ 编译器是必需的,但我从未尝试过,甚至不知道它是否可能。尝试一下会很有趣。我不会说 Kotlin,但如果你有一些东西让我开始,比如示例项目,最好是使用 Maven 构建,那么尝试一下可能会很有趣。如果有什么方法可以解决这个问题,我们最终会像@dreamcrash 建议的那样使用 AspectJ Maven 插件,只是方式不同。

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


更新: 我刚刚试了一下:

  • Kotlin 中的注释和方面
  • 用Kotlin编译器编译成my-aspect.jar, aspectjrt.jar on the class路径
  • 将 Kotlin classes 打包成 JAR
  • Java class 使用来自 Kotlin 方面 JAR 的注解
  • 在输入路径上使用 ajcmy-aspect.jaraspectjrt.jar 进行编译kotlin-stdlib.jar 在 class 路径上。
  • 结果例如在 bin 目录中,Java class 和来自 JAR 的两个 Kotlin classes,但是这次的方面由 ajc(比原始文件大 class)。
  • 运行 Java 程序带有 bin 文件夹,aspectjrt.jarkotlin-stdlib.jar 在 class 路径上。

效果很好,方面开始了。

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


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