私はクラスでランタイム変換を実行するために使用できる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(???)
}
}
}
}
こんにちは、実際の問題をちょっとだけ指摘してください。 Thx – guenhter
注釈付きメソッドを自分のAPIからBytebuddyのAdvice APIに直接渡すことはできません。新しいクラスファイルにそれらを挿入します。これらのメソッドのコードをクラスに挿入する方法を理解する必要があります – Redrield