]> source.dussan.org Git - javassist.git/commitdiff
fixed a bug found when an annotation includes an empty array.
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Wed, 7 Sep 2005 02:09:58 +0000 (02:09 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Wed, 7 Sep 2005 02:09:58 +0000 (02:09 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@206 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

15 files changed:
src/main/javassist/bytecode/annotation/AnnotationImpl.java
src/main/javassist/bytecode/annotation/AnnotationMemberValue.java
src/main/javassist/bytecode/annotation/ArrayMemberValue.java
src/main/javassist/bytecode/annotation/BooleanMemberValue.java
src/main/javassist/bytecode/annotation/ByteMemberValue.java
src/main/javassist/bytecode/annotation/CharMemberValue.java
src/main/javassist/bytecode/annotation/ClassMemberValue.java
src/main/javassist/bytecode/annotation/DoubleMemberValue.java
src/main/javassist/bytecode/annotation/EnumMemberValue.java
src/main/javassist/bytecode/annotation/FloatMemberValue.java
src/main/javassist/bytecode/annotation/IntegerMemberValue.java
src/main/javassist/bytecode/annotation/LongMemberValue.java
src/main/javassist/bytecode/annotation/MemberValue.java
src/main/javassist/bytecode/annotation/ShortMemberValue.java
src/main/javassist/bytecode/annotation/StringMemberValue.java

index f81b7b46ac6539e83ce0b2a2ad5349011b594dde..d4718ffcdbf00ba6496ddcedfaa4ec704db3b645 100644 (file)
@@ -56,12 +56,12 @@ class AnnotationImpl implements InvocationHandler {
         String name = method.getName();
         MemberValue mv = annotation.getMemberValue(name);
         if (mv == null)
-            return getDefault(name);
+            return getDefault(name, method);
         else
-            return mv.getValue(classLoader, pool);
+            return mv.getValue(classLoader, pool, method);
     }
 
-    private Object getDefault(String name)
+    private Object getDefault(String name, Method method)
         throws ClassNotFoundException, RuntimeException
     {
         String classname = annotation.getTypeName();
@@ -76,7 +76,7 @@ class AnnotationImpl implements InvocationHandler {
                           minfo.getAttribute(AnnotationDefaultAttribute.tag);
                     if (ainfo != null) {
                         MemberValue mv = ainfo.getDefaultValue();
-                        return mv.getValue(classLoader, pool);
+                        return mv.getValue(classLoader, pool, method);
                     }
                 }
             }
index 73da1637b679eb2b06f9e88699d4be621846bbff..368c82a9bfc0adca2587bc8a422d4a52d079ff01 100644 (file)
@@ -17,6 +17,7 @@ package javassist.bytecode.annotation;
 import javassist.ClassPool;
 import javassist.bytecode.ConstPool;
 import java.io.IOException;
+import java.lang.reflect.Method;
 
 /**
  * Nested annotation.
@@ -43,7 +44,7 @@ public class AnnotationMemberValue extends MemberValue {
         value = a;
     }
 
-    Object getValue(ClassLoader cl, ClassPool cp)
+    Object getValue(ClassLoader cl, ClassPool cp, Method m)
         throws ClassNotFoundException
     {
         return AnnotationImpl.make(cl, getType(cl), cp, value);
index dd586bb331674449f43105c46b2ebbcc5acf6b33..75ffe139d46f8db7156cbcdf58f011f5bcd6d165 100644 (file)
@@ -18,6 +18,7 @@ import javassist.ClassPool;
 import javassist.bytecode.ConstPool;
 import java.io.IOException;
 import java.lang.reflect.Array;
+import java.lang.reflect.Method;
 
 /**
  * Array member.
@@ -49,14 +50,27 @@ public class ArrayMemberValue extends MemberValue {
         values = null;
     }
 
-    Object getValue(ClassLoader cl, ClassPool cp) throws ClassNotFoundException {
-        if (type == null || values == null)
-            throw new ClassNotFoundException("no array elements specified");
+    Object getValue(ClassLoader cl, ClassPool cp, Method method)
+        throws ClassNotFoundException
+    {
+        if (values == null)
+            throw new ClassNotFoundException(
+                        "no array elements found: " + method.getName());
 
         int size = values.length;
-        Object a = Array.newInstance(type.getType(cl), size);
+        Class clazz;
+        if (type == null) {
+            clazz = method.getReturnType().getComponentType();
+            if (clazz == null || size > 0)
+                throw new ClassNotFoundException("broken array type: "
+                                                 + method.getName());
+        }
+        else
+            clazz = type.getType(cl);
+
+        Object a = Array.newInstance(clazz, size);
         for (int i = 0; i < size; i++)
-            Array.set(a, i, values[i].getValue(cl, cp));
+            Array.set(a, i, values[i].getValue(cl, cp, method));
 
         return a;
     }
index 7df117d76315357a239107cdb6f83be950550d41..29432b1f28f688e808a7a6ed03171ea167a40ba6 100644 (file)
@@ -17,6 +17,7 @@ package javassist.bytecode.annotation;
 import javassist.ClassPool;
 import javassist.bytecode.ConstPool;
 import java.io.IOException;
+import java.lang.reflect.Method;
 
 /**
  * Boolean constant value.
@@ -56,7 +57,7 @@ public class BooleanMemberValue extends MemberValue {
         setValue(false);
     }
 
-    Object getValue(ClassLoader cl, ClassPool cp) {
+    Object getValue(ClassLoader cl, ClassPool cp, Method m) {
         return new Boolean(getValue());
     }
 
index 3b8920103bc6ff00193e86c3b47365e1b7cbca4a..90763b090c1be2445d8ace0620e8541b9ff07cf1 100644 (file)
@@ -17,6 +17,7 @@ package javassist.bytecode.annotation;
 import javassist.ClassPool;
 import javassist.bytecode.ConstPool;
 import java.io.IOException;
+import java.lang.reflect.Method;
 
 /**
  * Byte constant value.
@@ -56,7 +57,7 @@ public class ByteMemberValue extends MemberValue {
         setValue((byte)0);
     }
 
-    Object getValue(ClassLoader cl, ClassPool cp) {
+    Object getValue(ClassLoader cl, ClassPool cp, Method m) {
         return new Byte(getValue());
     }
 
index 8d056d8b2ad04b1193fc1012974aa309f0f54a3b..f6691dfe81033dcea02ea9f0ebfd3efd88f4240a 100644 (file)
@@ -18,6 +18,7 @@ package javassist.bytecode.annotation;
 import javassist.ClassPool;
 import javassist.bytecode.ConstPool;
 import java.io.IOException;
+import java.lang.reflect.Method;
 
 /**
  * Char constant value.
@@ -57,7 +58,7 @@ public class CharMemberValue extends MemberValue {
         setValue('\0');
     }
 
-    Object getValue(ClassLoader cl, ClassPool cp) {
+    Object getValue(ClassLoader cl, ClassPool cp, Method m) {
         return new Character(getValue());
     }
 
index f5f2fe67a348105f9e6155bfe2e2208a76239ced..cf2f510b4cbc4ba0850584a745a43464f7553afd 100644 (file)
@@ -19,6 +19,7 @@ import javassist.ClassPool;
 import javassist.bytecode.ConstPool;
 import javassist.bytecode.Descriptor;
 import java.io.IOException;
+import java.lang.reflect.Method;
 
 /**
  * Class value.
@@ -59,7 +60,7 @@ public class ClassMemberValue extends MemberValue {
         setValue("java.lang.Class");
     }
 
-    Object getValue(ClassLoader cl, ClassPool cp)
+    Object getValue(ClassLoader cl, ClassPool cp, Method m)
         throws ClassNotFoundException
     {
         return loadClass(cl, getValue());
index 7c987875106e7a91d98c87ab229e3506319fae82..f2825ad461f72577a8eb69cec4051e2acf735e1e 100644 (file)
@@ -18,13 +18,14 @@ package javassist.bytecode.annotation;
 import javassist.ClassPool;
 import javassist.bytecode.ConstPool;
 import java.io.IOException;
+import java.lang.reflect.Method;
 
 /**
  * Double floating-point number constant value.
  *
  * @author <a href="mailto:bill@jboss.org">Bill Burke</a>
  * @author Shigeru Chiba
- * @version $Revision: 1.6 $
+ * @version $Revision: 1.7 $
  */
 public class DoubleMemberValue extends MemberValue {
     int valueIndex;
@@ -58,7 +59,7 @@ public class DoubleMemberValue extends MemberValue {
         setValue(0.0);
     }
 
-    Object getValue(ClassLoader cl, ClassPool cp) {
+    Object getValue(ClassLoader cl, ClassPool cp, Method m) {
         return new Double(getValue());
     }
 
index 77e07c27a396f52ef83fa7518d623ace5a3b767a..effec09c175302caf9179dd6ebdf92a0a657f51d 100644 (file)
@@ -16,6 +16,7 @@
 package javassist.bytecode.annotation;
 
 import java.io.IOException;
+import java.lang.reflect.Method;
 
 import javassist.ClassPool;
 import javassist.bytecode.ConstPool;
@@ -54,7 +55,7 @@ public class EnumMemberValue extends MemberValue {
         typeIndex = valueIndex = 0;
     }
 
-    Object getValue(ClassLoader cl, ClassPool cp)
+    Object getValue(ClassLoader cl, ClassPool cp, Method m)
         throws ClassNotFoundException
     {
         try {
index 622a9420210676fea829ad6b6954035a6ba5453f..7188b5e95095b95922c64e8bec99949932ead736 100644 (file)
@@ -18,13 +18,14 @@ package javassist.bytecode.annotation;
 import javassist.ClassPool;
 import javassist.bytecode.ConstPool;
 import java.io.IOException;
+import java.lang.reflect.Method;
 
 /**
  * Floating-point number constant value.
  *
  * @author <a href="mailto:bill@jboss.org">Bill Burke</a>
  * @author Shigeru Chiba
- * @version $Revision: 1.6 $
+ * @version $Revision: 1.7 $
  */
 public class FloatMemberValue extends MemberValue {
     int valueIndex;
@@ -58,7 +59,7 @@ public class FloatMemberValue extends MemberValue {
         setValue(0.0F);
     }
 
-    Object getValue(ClassLoader cl, ClassPool cp) {
+    Object getValue(ClassLoader cl, ClassPool cp, Method m) {
         return new Float(getValue());
     }
 
index 949f3752f9f5de2dd46447e6257fcc6ebb0c1333..2f2a9076987febb5c72981480c8665f011d1cc3f 100644 (file)
@@ -18,6 +18,7 @@ package javassist.bytecode.annotation;
 import javassist.ClassPool;
 import javassist.bytecode.ConstPool;
 import java.io.IOException;
+import java.lang.reflect.Method;
 
 /**
  * Integer constant value.
@@ -63,7 +64,7 @@ public class IntegerMemberValue extends MemberValue {
         setValue(0);
     }
 
-    Object getValue(ClassLoader cl, ClassPool cp) {
+    Object getValue(ClassLoader cl, ClassPool cp, Method m) {
         return new Integer(getValue());
     }
 
index a0dd13ad0f925f527ab78138202ea99a75e33aaf..2afd4a0f7d76b260b75c0306f5461d69b5f323e7 100644 (file)
@@ -18,6 +18,7 @@ package javassist.bytecode.annotation;
 import javassist.ClassPool;
 import javassist.bytecode.ConstPool;
 import java.io.IOException;
+import java.lang.reflect.Method;
 
 /**
  * Long integer constant value.
@@ -57,7 +58,7 @@ public class LongMemberValue extends MemberValue {
         setValue(0L);
     }
 
-    Object getValue(ClassLoader cl, ClassPool cp) {
+    Object getValue(ClassLoader cl, ClassPool cp, Method m) {
         return new Long(getValue());
     }
 
index 8ee6ce9ab291c23576d1ac3d74d843280220ec55..c976ddd386f9a8979fed906d85cef4598e3b6da3 100644 (file)
@@ -18,6 +18,7 @@ package javassist.bytecode.annotation;
 import javassist.ClassPool;
 import javassist.bytecode.ConstPool;
 import java.io.IOException;
+import java.lang.reflect.Method;
 
 /**
  * The value of a member declared in an annotation.
@@ -39,7 +40,7 @@ public abstract class MemberValue {
      * Returns the value.  If the value type is a primitive type, the
      * returned value is boxed.
      */
-    abstract Object getValue(ClassLoader cl, ClassPool cp)
+    abstract Object getValue(ClassLoader cl, ClassPool cp, Method m)
         throws ClassNotFoundException;
 
     abstract Class getType(ClassLoader cl) throws ClassNotFoundException;
index 7d38f4b4c184c6c8939a51ab27ff67c43653e844..3ccf38085e017a4e0f29af0221169a619cee941e 100644 (file)
@@ -18,6 +18,7 @@ package javassist.bytecode.annotation;
 import javassist.ClassPool;
 import javassist.bytecode.ConstPool;
 import java.io.IOException;
+import java.lang.reflect.Method;
 
 /**
  * Short integer constant value.
@@ -57,7 +58,7 @@ public class ShortMemberValue extends MemberValue {
         setValue((short)0);
     }
 
-    Object getValue(ClassLoader cl, ClassPool cp) {
+    Object getValue(ClassLoader cl, ClassPool cp, Method m) {
         return new Short(getValue());
     }
 
index 80cb5e3dce9ddd97481d54bd424a78f39bf66f60..970fb8f475000b5fbfa2dde252d3ab4f6f7b6abd 100644 (file)
@@ -18,6 +18,7 @@ package javassist.bytecode.annotation;
 import javassist.ClassPool;
 import javassist.bytecode.ConstPool;
 import java.io.IOException;
+import java.lang.reflect.Method;
 
 /**
  * String constant value.
@@ -57,7 +58,7 @@ public class StringMemberValue extends MemberValue {
         setValue("");
     }
 
-    Object getValue(ClassLoader cl, ClassPool cp) {
+    Object getValue(ClassLoader cl, ClassPool cp, Method m) {
         return getValue();
     }