2016-07-02 9 views
5

私は、AspectJを使ってKotlinの機能を織り込んでみましたが、成功しませんでした。 多分私は何かを間違って設定しているかもしれません。あるいは、AspectJがこれをサポートしていないかもしれません。JavaでAspectJを使っているような、コートリンのコードの前/後/前後に織り込む方法はありますか?

たとえば、mavenとEclipse(またはIntelliJ)を使用してこれが可能かどうかは知りませんか? それができない理由を説明してください。

+2

バイトコードレベルのすべての計測が機能する必要があります。そうでない場合は、問題がどこにあるかを知るために、作業していないコード+ビルドファイルの最小限の例が必要です。 – voddan

答えて

1

これは、私が "バイナリ"のやり方で織り上げたことです。その後、JavaとKotlinのコードがコンパイルされました。

aspectj-maven-pluginを正しく「バイナリ」に織り込むことができませんでした。そのため、代わりにjcabi-maven-pluginというプラグインを使用しました。 http://plugin.jcabi.com/example-ajc.html

私のために働いたポンポンを参照してください:

<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ファイルにmainメソッドとクラスが同じファイルで定義されている場合、Kotlinコンパイラは2つのクラスファイルを生成することに注意してください。クラスの名前を持つ1つのクラスとその名前に "Kt"が追加された1つのクラス。 exec-maven-pluginを使用してKotlinコードを実行しようとするとよいかどうかを知っておくとよいでしょう。

しかし、これは日食ではうまくいきませんでした。多分IntelliJはここでより良い仕事をするでしょう。

+1

kotlinでaspectjを使用する例はありますか?私はこれを試みたが、それは働かない。 – junk

3

その他のコメント/回答に加えて、inline functionsを使用して機能コードの前後にコードを「織り込む」ことができると指摘しておく価値があると思います。例えば:

fun main(vararg args: String) = nanoTimeAppendedTo(System.out, name = "main") { 
    /* do something, e.g.: */ 
    Thread.sleep(0) 
} 

inline fun nanoTimeAppendedTo(appendable: Appendable, name: String, block:() -> Unit) { 
    val nanoTime = measureNanoTime(block) 
    appendable.appendln("`$name` took $nanoTime ns") 
} 

あなたはAspectJのはあなたを与えるが、あなたは、単に/後/他のいくつかのコードの前後にこれだけで正常に動作する前に、いくつかのコードを実行して再利用したい単純な場合のためにする情報のすべてにアクセスすることはできません。

関連する問題