有没有什么办法在Kotlin编织代码之前/之后/周围的函数就像Java中的AspectJ?

我试图用AspectJ来编织Kotlin函数的方面,但没有成功。 也许我只是配置错误,或者AspectJ不支持这个。

有谁知道这是可能的,如使用Maven和Eclipse(或IntelliJ)? 还是小心解释为什么这是不可能的?

除了其他的评论/回答之外,我认为值得指出的是,你可以使用内联函数在代码之前/之后/之后“编织”代码。 例如:

fun main(vararg args: String) = nanoTimeAppendedTo(System.out, name = "main") { /* do something, eg: */ Thread.sleep(0) } inline fun nanoTimeAppendedTo(appendable: Appendable, name: String, block: () -> Unit) { val nanoTime = measureNanoTime(block) appendable.appendln("`$name` took $nanoTime ns") } 

您将无法访问AspectJ为您提供的所有信息,但对于简单的情况下,您只是想重复执行某些代码之前/之后/周围的其他代码,这工作得很好。

这是我在“二进制”方面编写的,然后编译了Java和Kotlin代码。

我无法得到aspectj-maven-plugin来正确编织“二进制”方面,所以我使用了插件jcabi-maven-plugin 。 请参阅http://plugin.jcabi.com/example-ajc.html

那个为我工作的pom:

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>my.group.id</groupId> <artifactId>my.artifact.id</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.6</maven.compiler.source> <maven.compiler.target>1.6</maven.compiler.target> <complianceLevel>1.6</complianceLevel> </properties> <dependencies> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib</artifactId> <version>1.0.3</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.9</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <groupId>org.apache.maven.plugins</groupId> <version>3.3</version> <configuration> <source>${maven.compiler.source}</source> <target>${maven.compiler.target}</target> </configuration> </plugin> <plugin> <artifactId>kotlin-maven-plugin</artifactId> <groupId>org.jetbrains.kotlin</groupId> <version>1.0.3</version> <configuration> <sourceDirs> <sourceDir>src/main/kotlin</sourceDir> <sourceDir>src/test/kotlin</sourceDir> </sourceDirs> </configuration> <executions> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> </execution> <execution> <id>test-compile</id> <phase>test-compile</phase> <goals> <goal>test-compile</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>com.jcabi</groupId> <artifactId>jcabi-maven-plugin</artifactId> <version>0.14.1</version> <executions> <execution> <goals> <goal>ajc</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.5.0</version> <configuration> <mainClass>my.package.MyMainClassKt</mainClass> </configuration> </plugin> </plugins> </build> 

因此,这与Java中定义的方面和一些注释一起工作,然后使用这些注释来注释Kotlin方法和类,以便将方面成功注入到Kotlin代码中。

请注意,如果Kotlin文件具有在同一个文件中定义的主方法和类,则Kotlin编译器会生成两个类文件。 一个班级的名字和一个“Kt”的班级添加到它的名字。 很高兴知道您是否尝试使用exec-maven-plugin运行Kotlin代码。

但是,这在日食方面表现不佳。 也许IntelliJ会在这里做得更好。