2012-08-02 69 views
1

我試圖在類加載時添加一些註釋。
爲此,我寫了一個java代理變壓器,它可以在加載時獲取類字節碼,並且可以更改它。 當我運行以下代碼時,類的新註釋apears被刪除,但所有先前的註釋和字段/方法都被刪除。用javassist添加註釋會刪除以前的代碼

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是返回到類加載器的字節數組。 如果任何人有一個想法,爲什麼以前的類註釋和代碼被刪除,這將是非常有益的。
謝謝,
阿夫納

回答

3

setAnnotation只需要一個參數,即Annotation型的,它會刪除所有其他的註解。如果您想添加註釋到現有的註釋,請改爲使用setAnnotations。它需要一個數組Annotation,因此您首先要收集所有現有的註釋(使用getAnnotations),然後在最後添加Annotation,然後調用該方法來構建數組。

一個setAnnotation(annotation)調用等效於setAnnotations(new Annotation[] { annotation })

+0

謝謝!我會嘗試一下。 – 2012-08-03 20:04:00

相關問題