[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