[jboss-cvs] JBossAS SVN: r106981 - in projects/jboss-reflect/trunk/src: main/java/org/jboss/reflect/plugins/bytecode/bytes/asm and 3 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Wed Jul 21 10:51:00 EDT 2010
Author: kabir.khan at jboss.com
Date: 2010-07-21 10:50:57 -0400 (Wed, 21 Jul 2010)
New Revision: 106981
Modified:
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/ConstructorInfoImpl.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/bytes/asm/AsmBehaviourBytes.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedParameterInfo.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistConstructorInfo.java
projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/ClassInfoParameterAnnotationsNotAllParametersAnnotated.java
projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/AnnotatedClassInfoTest.java
Log:
[JBREFLECT-135] Fix parameter annotations non-static inner classes
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/ConstructorInfoImpl.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/ConstructorInfoImpl.java 2010-07-21 13:56:15 UTC (rev 106980)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/ConstructorInfoImpl.java 2010-07-21 14:50:57 UTC (rev 106981)
@@ -91,8 +91,19 @@
{
this.parameterTypes = parameterTypes;
this.parameters = new ParameterInfoImpl[parameterTypes.length];
- for (int i = 0; i < parameterTypes.length; ++i)
- this.parameters[i] = new ParameterInfoImpl(parameterAnnotations[i], null, parameterTypes[i]);
+
+ int ann = 0;
+ if (parameterAnnotations.length != parameterTypes.length)
+ {
+ if (parameterAnnotations.length == parameterTypes.length - 1 && declaring.getType().getDeclaringClass() != null)
+ //This will only happen for the constructors for non-static inner classes which take an extra 'this' parameter
+ ann = -1;
+ }
+ for (int i = 0 ; i < parameterTypes.length; ++i)
+ {
+ AnnotationValue[] val = i + ann >= 0 ? parameterAnnotations[i + ann] : null;
+ this.parameters[i] = new ParameterInfoImpl(val, null, parameterTypes[i]);
+ }
}
if (exceptionTypes == null)
this.exceptionTypes = MethodInfo.NO_EXCEPTIONS;
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/bytes/asm/AsmBehaviourBytes.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/bytes/asm/AsmBehaviourBytes.java 2010-07-21 13:56:15 UTC (rev 106980)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/bytes/asm/AsmBehaviourBytes.java 2010-07-21 14:50:57 UTC (rev 106981)
@@ -169,8 +169,16 @@
@Override
public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible)
{
- lastIndex = parameter;
- return Util.createAnnotationVisitor(this, AsmBehaviourBytes.this.getClazz().getClassLoader(), desc);
+ try
+ {
+ lastIndex = parameter;
+ return Util.createAnnotationVisitor(this, AsmBehaviourBytes.this.getClazz().getClassLoader(), desc);
+ }
+ catch (Exception e)
+ {
+ //Annotation could not be read
+ return null;
+ }
}
public void setValueInParent(String name, Object value)
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedParameterInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedParameterInfo.java 2010-07-21 13:56:15 UTC (rev 106980)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedParameterInfo.java 2010-07-21 14:50:57 UTC (rev 106981)
@@ -188,15 +188,22 @@
protected void setupParameterAnnotations(Object[][] annotations)
{
+ int offset = isInnerClassConstructor(annotations) ? -1 : 0;
+
for (int param = 0 ; param < annotations.length ; param++)
{
- AnnotationValue[] annotationValues = new AnnotationValue[annotations[param].length];
- for (int ann = 0 ; ann < annotationValues.length ; ann++)
+ AnnotationValue[] annotationValues = null;
+
+ if (offset + param >= 0)
{
- Class<?> clazz = ((Annotation)annotations[param][ann]).annotationType();
-
- AnnotationInfo info = (AnnotationInfo)((JavassistTypeInfoFactoryImpl)annotationHelper).getTypeInfo(clazz);
- annotationValues[ann] = annotationHelper.createAnnotationValue(info, annotations[param][ann]);
+ annotationValues = new AnnotationValue[annotations[param + offset].length];
+ for (int ann = 0 ; ann < annotationValues.length ; ann++)
+ {
+ Class<?> clazz = ((Annotation)annotations[param + offset][ann]).annotationType();
+
+ AnnotationInfo info = (AnnotationInfo)((JavassistTypeInfoFactoryImpl)annotationHelper).getTypeInfo(clazz);
+ annotationValues[ann] = annotationHelper.createAnnotationValue(info, annotations[param + offset][ann]);
+ }
}
((JavassistParameterInfo)parameters[param]).setAnnotations(annotationValues);
}
@@ -309,4 +316,13 @@
{
return ctBehavior.getSignature();
}
+
+ /**
+ * Returns false for methods. If a constructor, will return true if
+ * it is a constructor for a non-static inner class.
+ */
+ protected boolean isInnerClassConstructor(Object[][] annotations)
+ {
+ return false;
+ }
}
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistConstructorInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistConstructorInfo.java 2010-07-21 13:56:15 UTC (rev 106980)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistConstructorInfo.java 2010-07-21 14:50:57 UTC (rev 106981)
@@ -21,9 +21,11 @@
*/
package org.jboss.reflect.plugins.javassist;
+import java.lang.reflect.Modifier;
import java.util.Arrays;
import javassist.CtConstructor;
+import javassist.NotFoundException;
import javassist.bytecode.MethodInfo;
import org.jboss.reflect.plugins.AnnotationHelper;
@@ -134,4 +136,30 @@
{
return MethodInfo.nameInit;
}
+
+ @Override
+ protected boolean isInnerClassConstructor(Object[][] annotations)
+ {
+ try
+ {
+ if (annotations.length == parameterTypes.length)
+ return false;
+
+ if (annotations.length != parameterTypes.length - 1)
+ throw new IllegalArgumentException("Bad inner class constructor parameter length");
+
+ if (ctBehavior.getDeclaringClass().getDeclaringClass() == null)
+ throw new IllegalArgumentException("Not an inner class");
+
+ if (Modifier.isStatic(ctBehavior.getDeclaringClass().getModifiers()))
+ throw new IllegalArgumentException("Inner class");
+
+ return true;
+ }
+ catch (NotFoundException e)
+ {
+ throw new RuntimeException(e);
+ }
+
+ }
}
Modified: projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/ClassInfoParameterAnnotationsNotAllParametersAnnotated.java
===================================================================
--- projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/ClassInfoParameterAnnotationsNotAllParametersAnnotated.java 2010-07-21 13:56:15 UTC (rev 106980)
+++ projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/ClassInfoParameterAnnotationsNotAllParametersAnnotated.java 2010-07-21 14:50:57 UTC (rev 106981)
@@ -35,6 +35,13 @@
public void method(@SimpleAnnotation int i, int j)
{
-
}
+
+ public class InnerClass
+ {
+ public InnerClass(@SimpleAnnotation int i, int j)
+ {
+
+ }
+ }
}
Modified: projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/AnnotatedClassInfoTest.java
===================================================================
--- projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/AnnotatedClassInfoTest.java 2010-07-21 13:56:15 UTC (rev 106980)
+++ projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/AnnotatedClassInfoTest.java 2010-07-21 14:50:57 UTC (rev 106981)
@@ -408,6 +408,20 @@
assertSame(getTypeInfoFactory().getTypeInfo(SimpleAnnotation.class), methodParams[0].getAnnotations()[0].getAnnotationType());
}
+ public void testInnerClassConstructorParameterAnnotationsNotAllParametersAnnotated() throws Throwable
+ {
+ ClassInfo info = assertInstanceOf(getTypeInfoFactory().getTypeInfo(ClassInfoParameterAnnotationsNotAllParametersAnnotated.InnerClass.class), ClassInfo.class);
+
+ ConstructorInfo[] constructors = info.getDeclaredConstructors();
+ assertEquals(1, constructors.length);
+ ParameterInfo[] constructorParams = constructors[0].getParameters();
+ assertEquals(3, constructorParams.length);
+ assertEquals(0, constructorParams[2].getAnnotations().length);
+ assertEquals(0, constructorParams[0].getAnnotations().length);
+ assertEquals(1, constructorParams[1].getAnnotations().length);
+ assertSame(getTypeInfoFactory().getTypeInfo(SimpleAnnotation.class), constructorParams[1].getAnnotations()[0].getAnnotationType());
+ }
+
private void checkNoAnnotations(AnnotatedInfo info)
{
assertNull(info.getAnnotation("x"));
More information about the jboss-cvs-commits
mailing list