Details
-
Bug
-
Status: Closed
-
Minor
-
Resolution: Fixed
-
6.8.1
-
None
-
None
-
Operating System: All
Platform: All
Description
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 @@
+
+ public final void dump(DataOutputStream dos) throws IOException
+
}