【问题标题】:Adding annotations with javassist removes previous code使用 javassist 添加注释会删除以前的代码
【发布时间】:2012-07-31 11:29:36
【问题描述】:

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

【问题讨论】:

    标签: reflection code-generation javassist javaagents


    【解决方案1】:

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

    setAnnotation(annotation) 调用等同于 setAnnotations(new Annotation[] { annotation })

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多