2017-07-19 4 views
1

私はクラスでランタイム変換を実行するために使用できるbytebuddyの上にライブラリを作成しようとしています。私が作っているAPIは、変換されたクラスにメソッドコードを挿入するためにByteBuddyで直接操作することはできません(変換されていないメソッドを変換されたクラスに新たに追加し、@Injectで注釈を付けたメソッドを先頭または末尾既存のメソッドの)私の解決策は、相互運用性の欠如のために、私のより高いレベルのAPIとByteBuddyのAdvice APIとの間で変換するByteBuddyを使用して一時クラスを作成することでした。しかし、実際にはアドバイスを使用することができないため、上位レベルAPIのメソッドからすべてのコードを下位レベルAPIのメソッドに挿入する方法を理解できません。私はこれを行う方法がありますか?Methodから新しいクラスにコードを挿入

これは私がこのポイントにして作ってみたコード

fun apply(vararg transformerClasses: Class<*>) { 
    for(clazz in transformerClasses) { 
     val builder = ByteBuddy() 
       .subclass(clazz) 
     val mixinAnnotation = clazz.getAnnotation(Mixin::class.java) as? Mixin ?: throw RuntimeException("Passed transformer class without @Mixin annotation") 
     val mixinTarget = mixinAnnotation.target.java 

     for(method in clazz.declaredMethods) { 
      if(method.annotations.isEmpty()) { 
       builder.defineMethod(method.name, method.returnType, Visibility.PUBLIC, Ownership.STATIC) 
         .intercept(???) 
      } 
     } 
    } 
} 
+0

こんにちは、実際の問題をちょっとだけ指摘してください。 Thx – guenhter

+0

注釈付きメソッドを自分のAPIからBytebuddyのAdvice APIに直接渡すことはできません。新しいクラスファイルにそれらを挿入します。これらのメソッドのコードをクラスに挿入する方法を理解する必要があります – Redrield

答えて

0

あり、そうする良い方法は実際にはありませんが、一つの解がcresteにカスタムを翻訳TypeDescriptionインスタンスになりますです注釈をByte Buddyの注釈に追加します。 このようなオブジェクトの作成にはInstrumentedTypeの実装を使用できます。

クラス名が一致する場合、バイトバディは正しいクラスファイルからバイトコードを読み込みます。クラスファイルと型記述の間に整合性チェックはありません。

関連する問題