While using bcel to read in and then write out an annotation that has a default value without making any changes to it, I discovered that the resulting class did not contain the annotation default. The annotation looks something like this: @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Foo { String name() default ""; } The missing bytes caused a (very misleading) NoClassDefFoundError when I tried to load the new class. When I tried to decompile the new class, I got this error: ItemCollectionInvalidIndex: constants: requested 1280, limit 27 After comparing the original class with the new class in a hex editor, I determined that the bytes for the AnnotationDefault were missing. The problem is that the AnnotationDefault class does not have a dump method. I added a dump method and this fixed the problem. Here's a diff of the new method: $ svn diff Index: src/main/java/org/apache/bcel/classfile/AnnotationDefault.java =================================================================== --- src/main/java/org/apache/bcel/classfile/AnnotationDefault.java (revision 573325) +++ src/main/java/org/apache/bcel/classfile/AnnotationDefault.java (working copy) @@ -18,6 +18,7 @@ import java.io.DataInputStream; import java.io.IOException; +import java.io.DataOutputStream; import org.apache.bcel.Constants; /** @@ -105,4 +106,10 @@ { throw new RuntimeException("Not implemented yet!"); } + + public final void dump(DataOutputStream dos) throws IOException + { + super.dump(dos); + default_value.dump(dos); + } }
Thanks, applied to trunk