[jboss-cvs] JBossAS SVN: r104271 - projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Tue Apr 27 13:26:10 EDT 2010
Author: kabir.khan at jboss.com
Date: 2010-04-27 13:26:09 -0400 (Tue, 27 Apr 2010)
New Revision: 104271
Modified:
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistParameterizedClassInfo.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java
Log:
[JBREFLECT-5] Always lazily load up the type arguments for the parameterized class infos
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistParameterizedClassInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistParameterizedClassInfo.java 2010-04-27 16:48:43 UTC (rev 104270)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistParameterizedClassInfo.java 2010-04-27 17:26:09 UTC (rev 104271)
@@ -21,6 +21,8 @@
*/
package org.jboss.reflect.plugins.javassist;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
import java.util.Collection;
import java.util.Map;
@@ -30,7 +32,10 @@
import org.jboss.reflect.plugins.ClassInfoImpl;
import org.jboss.reflect.spi.ClassInfo;
+import org.jboss.reflect.spi.ConstructorInfo;
import org.jboss.reflect.spi.DelegateClassInfo;
+import org.jboss.reflect.spi.FieldInfo;
+import org.jboss.reflect.spi.MethodInfo;
import org.jboss.reflect.spi.TypeInfo;
import org.jboss.reflect.spi.TypeInfoFactory;
import org.jboss.util.JBossStringBuilder;
@@ -50,29 +55,23 @@
/** The factory */
private final JavassistTypeInfoFactoryImpl factory;
- /** The javassist generic type arguments */
- private final TypeArgument[] typeArguments;
-
- /** The generic type argument type infos */
private volatile TypeInfo[] typeArgumentInfos = ClassInfoImpl.UNKNOWN_TYPES;
+
+ private final LazyTypeArgumentFactory lazyTypeArgumentFactory;
- /** Utility to determine the actual bounds of generic type variables */
- private final JavassistTypeVariableSpy spy;
-
- /** The classloader used to create this parameterized type, it is used to load up the generic info */
- private final ClassLoader classLoader;
-
/**
* Constructor
*
* @param factory the javassist type info factory
* @param delegate the class info containing the parameterized type's raw type
+ * @param classLoader the class loader to use when lazily loading up the arguments
* @param typeArguments the javassist generic type arguments
* @param spy used to determine the actual bounds of generic type variables
+ * @throws IllegalArgumentException if any of the parameters are null
*/
- JavassistParameterizedClassInfo(JavassistTypeInfoFactoryImpl factory, ClassInfo delegate, ClassLoader cl, TypeArgument[] typeArguments, JavassistTypeVariableSpy spy)
+ public JavassistParameterizedClassInfo(JavassistTypeInfoFactoryImpl factory, ClassInfo delegate, ClassLoader classLoader, TypeArgument[] typeArguments, JavassistTypeVariableSpy spy)
{
- this(factory, delegate, cl, typeArguments, spy, ClassInfoImpl.UNKNOWN_TYPES);
+ this(factory, delegate, classLoader, typeArguments, spy, null);
}
/**
@@ -80,21 +79,24 @@
*
* @param factory the javassist type info factory
* @param delegate the class info containing the parameterized type's raw type
- * @param typeArgumentInfos the type infos for the type arguments
+ * @param reflectTypeArguments the type infos for the type arguments
+ * @throws IllegalArgumentException if any of the parameters are null
*/
- public JavassistParameterizedClassInfo(JavassistTypeInfoFactoryImpl factory, ClassInfo delegate, TypeInfo[] typeArgumentInfos)
+ public JavassistParameterizedClassInfo(JavassistTypeInfoFactoryImpl factory, ClassInfo delegate, Type[] reflectTypeArguments)
{
- this(factory, delegate, null, null, null, typeArgumentInfos);
+ this(factory, delegate, null, null, null, reflectTypeArguments);
}
- private JavassistParameterizedClassInfo(JavassistTypeInfoFactoryImpl factory, ClassInfo delegate, ClassLoader cl, TypeArgument[] typeArguments, JavassistTypeVariableSpy spy, TypeInfo[] typeArgumentInfos)
+ private JavassistParameterizedClassInfo(JavassistTypeInfoFactoryImpl factory, ClassInfo delegate, ClassLoader classLoader, TypeArgument[] typeArguments, JavassistTypeVariableSpy spy, Type[] reflectTypeArguments)
{
super(delegate);
+ if (factory == null)
+ throw new IllegalArgumentException("null factory");
this.factory = factory;
- this.typeArguments = typeArguments;
- this.spy = spy;
- this.typeArgumentInfos = typeArgumentInfos;
- this.classLoader = cl;
+ if (reflectTypeArguments != null)
+ lazyTypeArgumentFactory = new FromReflectTypeArgumentFactory(reflectTypeArguments);
+ else
+ lazyTypeArgumentFactory = new FromClassFileTypeArgumentFactory(typeArguments, spy, classLoader);
}
@Override
@@ -106,24 +108,16 @@
@Override
public ClassLoader getClassLoader()
{
- return classLoader;
+ //TODO secure
+ return lazyTypeArgumentFactory.getClassLoader();
}
@Override
public TypeInfo[] getActualTypeArguments()
{
- if (typeArgumentInfos == ClassInfoImpl.UNKNOWN_TYPES && typeArguments != null && typeArguments.length > 0)
+ if (typeArgumentInfos == ClassInfoImpl.UNKNOWN_TYPES)
{
- if (delegate instanceof JavassistTypeInfo == false)
- throw new IllegalStateException("Delegate is not a javassist one");
-
- TypeInfo[] infos = new TypeInfo[typeArguments.length];
-
- for (int i = 0 ; i < typeArguments.length ; i++)
- {
- infos[i] = factory.createTypeInfoForTypeArgument(typeArguments[i], classLoader, spy);
- }
- typeArgumentInfos = infos;
+ typeArgumentInfos = lazyTypeArgumentFactory.createTypeInfos();
}
return typeArgumentInfos;
@@ -231,4 +225,106 @@
}
}
+ private interface LazyTypeArgumentFactory
+ {
+ TypeInfo[] createTypeInfos();
+
+ ClassLoader getClassLoader();
+ }
+
+ /**
+ * Used to lazily create type arguments for the parameterized type if it
+ * has been accessed with {@link TypeInfoFactory#getTypeInfo(Type)} and the
+ * parameter is of type {@link ParameterizedType}
+ *
+ */
+ private class FromReflectTypeArgumentFactory implements LazyTypeArgumentFactory
+ {
+ /** The generic type argument type infos */
+ private final Type[] typeArguments;
+
+ FromReflectTypeArgumentFactory(Type[] typeArguments)
+ {
+ this.typeArguments = typeArguments;
+ }
+
+ public TypeInfo[] createTypeInfos()
+ {
+ TypeInfo[] infos = new TypeInfo[typeArguments.length];
+ for (int i = 0 ; i < typeArguments.length ; i++)
+ {
+ try
+ {
+ infos[i] = factory.getTypeInfo(typeArguments[i]);
+ }
+ catch (Exception e)
+ {
+ throw new IllegalStateException(e);
+ }
+ }
+ return infos;
+ }
+
+ public ClassLoader getClassLoader()
+ {
+ return ((JavassistTypeInfo)delegate).getClassLoaderInternal();
+ }
+ }
+
+ /**
+ * Used to lazily create type arguments for the parameterized type if the parameterized
+ * type is loaded up as a result of calling
+ * {@link ClassInfo#getGenericSuperclass()},
+ * {@link ClassInfo#getGenericInterfaces()},
+ * {@link MethodInfo#getReturnType()},
+ * {@link MethodInfo#getParameterTypes()},
+ * {@link ConstructorInfo#getParameterTypes()} or
+ * {@link FieldInfo#getType()}
+ *
+ * in which case we end up in {@link JavassistTypeInfoFactoryImpl#getParameterizedType(ParameterizedType)}
+ *
+ */
+ private class FromClassFileTypeArgumentFactory implements LazyTypeArgumentFactory
+ {
+ /** The generic type arguments from the javassist class file */
+ private final TypeArgument[] typeArguments;
+
+ /** Utility to determine the actual bounds of generic type variables */
+ private final JavassistTypeVariableSpy spy;
+
+ /** The classloader used to create this parameterized type, it is used to load up the generic info */
+ private final ClassLoader classLoader;
+
+ public FromClassFileTypeArgumentFactory(TypeArgument[] typeArguments, JavassistTypeVariableSpy spy, ClassLoader classLoader)
+ {
+ this.typeArguments = typeArguments;
+ this.spy = spy;
+ this.classLoader = classLoader;
+ }
+
+ public TypeInfo[] createTypeInfos()
+ {
+ if (typeArguments != null && typeArguments.length > 0)
+ {
+ if (delegate instanceof JavassistTypeInfo == false)
+ throw new IllegalStateException("Delegate is not a javassist one");
+
+ TypeInfo[] infos = new TypeInfo[typeArguments.length];
+
+ for (int i = 0 ; i < typeArguments.length ; i++)
+ {
+ infos[i] = factory.createTypeInfoForTypeArgument(typeArguments[i], classLoader, spy);
+ }
+ typeArgumentInfos = infos;
+ }
+
+ return typeArgumentInfos;
+ }
+
+ public ClassLoader getClassLoader()
+ {
+ return classLoader;
+ }
+
+ }
}
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java 2010-04-27 16:48:43 UTC (rev 104270)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java 2010-04-27 17:26:09 UTC (rev 104271)
@@ -791,18 +791,7 @@
Type[] types = type.getActualTypeArguments();
TypeInfo[] typeInfos = new TypeInfo[types.length];
- for (int i = 0 ; i < typeInfos.length ; i++)
- {
- try
- {
- typeInfos[i] = getTypeInfo(types[i]);
- }
- catch (Exception e)
- {
- throw new IllegalStateException(e);
- }
- }
- info = new JavassistParameterizedClassInfo(this, raw, typeInfos);
+ info = new JavassistParameterizedClassInfo(this, raw, types);
//Cache the parameterized type info
cache.put(genericName, new WeakReference<TypeInfo>(info));
More information about the jboss-cvs-commits
mailing list