在Kotlin中是否有任何方法可以编写代码之前/之后/周围的函数,就像Java中的AspectJ一样?

Use*_*er0 6 aspectj kotlin

我试图使用AspectJ来编织Kotlin函数的各个方面,但没有成功.也许我只是错误地配置了一些东西,或者AspectJ不支持这个.

有没有人知道这是否可以使用例如maven和Eclipse(或IntelliJ)?还是要小心解释为什么不可能?

Use*_*er0 3

这就是我所做的,以“二进制”方式编织方面,然后编译了 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>
Run Code Online (Sandbox Code Playgroud)

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

请注意,如果 Kotlin 文件在同一文件中同时定义了 main 方法和类,则 Kotlin 编译器会生成两个类文件。一个类带有类名,另一类类的名称中添加了“Kt”。如果您尝试使用 exec-maven-plugin 来运行 Kotlin 代码,很高兴知道。

然而,这在 eclipse 中并没有很好地发挥作用。也许 IntelliJ 在这方面会做得更好。

  • 有没有在kotlin中使用aspectj的例子?我已经尝试过这个;但它不起作用。 (2认同)