1

ロード中にいくつかの注釈をクラスに追加しようとしています。
そのために、ロード時にクラスバイトコードを取得して変更できるJavaエージェントトランスフォーマーを作成しました。次のコードを実行すると、クラスに新しい注釈が表示されますが、以前の注釈とフィールド/メソッドはすべて削除されます。

CtClass ctClass = classPool.makeClass(new java.io.ByteArrayInputStream(classFileBuffer));
ClassFile classFile = clazz.getClassFile();
ConstPool constPool = classFile.getConstPool();
AnnotationsAttribute attr= new AnnotationsAttribute(constPool, AnnotationsAttribute.visibleTag);
javassist.bytecode.annotation.Annotation annotation = new javassist.bytecode.annotation.Annotation(type, constPool);
attr.setAnnotation(annotation);
classFile.addAttribute(attr);
classFileBuffer = ctClass.toBytecode();

classFileBuffer は、クラスローダーに返されるバイト配列です。以前のクラスの注釈とコードが削除された理由を知っている人がいれば、非常に役に立ちます。
ありがとう、
アヴナー

4

1 に答える 1

4

setAnnotation型のパラメータを 1 つだけ取りAnnotation、他のすべての注釈を消去します。既存のものに注釈を追加する場合は、setAnnotations代わりに使用します。の配列を取るAnnotationため、最初にすべての既存の注釈を収集して ( を使用してgetAnnotations) 配列を構築し、最後に を追加してAnnotationからメソッドを呼び出す必要があります。

呼び出しはsetAnnotation(annotation)と同等ですsetAnnotations(new Annotation[] { annotation })

于 2012-08-03T09:43:45.977 に答える