使用javassist添加注释会删除以前的代码

时间:2012-08-02 13:25:00

标签: reflection code-generation javassist javaagents

我正在尝试在加载类时为类添加一些注释 为此,我编写了一个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是返回给类加载器的字节数组。 如果有人知道为什么删除以前的类注释和代码,那将非常有用 谢谢,
  阿夫纳

1 个答案:

答案 0 :(得分:3)

setAnnotation只接受一个Annotation类型的参数,并删除所有其他注释。如果要为现有注释添加注释,请改用setAnnotations。它需要Annotation数组,因此您首先通过收集所有现有注释(使用getAnnotations)来构建数组,然后在结尾添加Annotation,然后调用方法。 / p>

setAnnotation(annotation)来电相当于setAnnotations(new Annotation[] { annotation })