Добавление аннотаций с помощью javassist удаляет предыдущий код

Я пытаюсь добавить некоторые аннотации к классам во время их загрузки.
Для этого я написал преобразователь агента 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 — массив байтов, возвращаемый загрузчику классов. Если у кого-нибудь есть идея, почему аннотации и код предыдущего класса удалены, это будет очень полезно.
Спасибо,
Авнер


person Avner Levy    schedule 02.08.2012    source источник


Ответы (1)


setAnnotation принимает только один параметр типа Annotation и стирает все остальные аннотации. Если вы хотите добавить аннотацию к существующим, используйте вместо этого setAnnotations. Он принимает массив Annotation, поэтому вам нужно сначала построить массив, собрав все существующие аннотации (используя getAnnotations), затем добавить Annotation в конце, а затем вызвать метод.

вызов setAnnotation(annotation) эквивалентен setAnnotations(new Annotation[] { annotation })

person Max    schedule 03.08.2012