2012-08-02 114 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