[jboss-cvs] JBossAS SVN: r105060 - in projects/jboss-reflect/trunk/src: main/java/org/jboss/reflect/plugins/javassist/bytecode and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu May 20 13:08:50 EDT 2010


Author: kabir.khan at jboss.com
Date: 2010-05-20 13:08:47 -0400 (Thu, 20 May 2010)
New Revision: 105060

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/JavassistConstructorInfo.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistFieldInfo.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistMethodInfo.java
   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/JavassistReflectionFactory.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfo.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeVariableSpy.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistUtil.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/SecurityActions.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/SignatureKey.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/ErrorCheckingMemberFactory.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistBehaviorFactory.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistConstructorFactory.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistFieldFactory.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistMemberFactory.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistMethodFactory.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/SecurityActions.java
   projects/jboss-reflect/trunk/src/test/java/org/jboss/test/plugins/javassist/bytecode/test/AbstractJavassistMemberFactoryTest.java
Log:
[JBREFLECT-124] More avoidance of usage of CtBehavior.getParameterTypes(). Use Javassist[Field/Method/Constructor]Info and their SignatureKey in the JavassistMemberFactory

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-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedParameterInfo.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -107,7 +107,7 @@
       return Modifier.isVolatile(getModifiers());
    }
 
-   public ClassInfo getDeclaringClass()
+   public JavassistTypeInfo getDeclaringClass()
    {
       return typeInfo;
    }
@@ -182,6 +182,8 @@
    {
       return getAnnotations(ctBehavior);
    }
+   
+   public abstract String getName();
       
    protected void setupParameterAnnotations(Object[][] annotations)
    {
@@ -297,8 +299,13 @@
       return methodSignature;
    }
 
-   protected SignatureKey getSignatureKey()
+   public SignatureKey getSignatureKey()
    {
       return signatureKey;
    }
+   
+   public String getDescriptor()
+   {
+      return ctBehavior.getSignature();
+   }
 }

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-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistConstructorInfo.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -24,6 +24,7 @@
 import java.util.Arrays;
 
 import javassist.CtConstructor;
+import javassist.bytecode.MethodInfo;
 
 import org.jboss.reflect.plugins.AnnotationHelper;
 import org.jboss.reflect.spi.ConstructorInfo;
@@ -125,4 +126,10 @@
    {
       return (CtConstructor)ctBehavior;
    }
+
+   @Override
+   public String getName()
+   {
+      return MethodInfo.nameInit;
+   }
 }

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistFieldInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistFieldInfo.java	2010-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistFieldInfo.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -242,5 +242,10 @@
    {
       ctField.setType(JavassistUtil.toCtClass(typeInfo.getCtClass().getClassPool(), type));
       typeInfo.clearFieldCache();
-   }   
+   }
+   
+   public String getDescriptor()
+   {
+      return ctField.getSignature();
+   }
 }

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistMethodInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistMethodInfo.java	2010-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistMethodInfo.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -84,11 +84,6 @@
       return name;
    }
 
-   public ClassInfo getDeclaringClass()
-   {
-      return typeInfo;
-   }
-
    public TypeInfo getReturnType()
    {
       if (returnType != null)

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-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistParameterizedClassInfo.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -23,12 +23,9 @@
 
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
-import java.util.Collection;
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Set;
 
-import javassist.CtClass;
 import javassist.bytecode.SignatureAttribute.ClassSignature;
 import javassist.bytecode.SignatureAttribute.TypeArgument;
 

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistReflectionFactory.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistReflectionFactory.java	2010-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistReflectionFactory.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -185,7 +185,7 @@
    {
       String sig = JavassistUtil.getSignature(info.getCtMethod());
       JavassistMethod method = generateAccessor(sig) ?
-            JavassistMemberFactory.createJavassistMethod(MAGIC_ACCESSOR_IMPL, info.getCtMethod(), debug) :
+            JavassistMemberFactory.createJavassistMethod(MAGIC_ACCESSOR_IMPL, info, debug) :
                DefaultMemberFactory.createJavassistMethod(info);
       
       if (enableMetrics)
@@ -205,7 +205,7 @@
    {
       String sig = JavassistUtil.getSignature(info.getCtConstructor());
       JavassistConstructor ctor = generateAccessor(sig) ?
-            JavassistMemberFactory.createJavassistConstructor(MAGIC_ACCESSOR_IMPL, info.getCtConstructor(), debug) :
+            JavassistMemberFactory.createJavassistConstructor(MAGIC_ACCESSOR_IMPL, info, debug) :
                DefaultMemberFactory.createJavassistConstructor(info);
             
       if (enableMetrics)
@@ -225,7 +225,7 @@
    {
       String sig = JavassistUtil.getSignature(info.getCtField());
       JavassistField field = generateAccessor(sig) ?
-            JavassistMemberFactory.createJavassistField(MAGIC_ACCESSOR_IMPL, info.getCtField(), debug) :
+            JavassistMemberFactory.createJavassistField(MAGIC_ACCESSOR_IMPL, info, debug) :
                DefaultMemberFactory.createJavassistField(info);
             
       if (enableMetrics)

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfo.java	2010-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfo.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -34,7 +34,6 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import javassist.CannotCompileException;
-import javassist.CtBehavior;
 import javassist.CtClass;
 import javassist.CtConstructor;
 import javassist.CtField;
@@ -42,7 +41,6 @@
 import javassist.CtNewConstructor;
 import javassist.CtNewMethod;
 import javassist.NotFoundException;
-import javassist.bytecode.Descriptor;
 import javassist.bytecode.SignatureAttribute.ClassSignature;
 import javassist.bytecode.SignatureAttribute.ClassType;
 
@@ -673,11 +671,9 @@
    protected MutableConstructorInfo generateConstructorInfo(CtConstructor constructor)
    {
       //Create the signature from the constructor signature directly so we can lazy load parameters
-      //CtBeahavior.getParameterTypes() does not cache the parameters meaning that it is an expensive
+      //CtBehavior.getParameterTypes() does not cache the parameters meaning that it is an expensive
       //call needing to hit the class pool to load the CtClass every time 
-      String[] params = getParameterTypeStringsForSignature(constructor);
-      
-      SignatureKey key = new SignatureKey(null, params);
+      SignatureKey key = new SignatureKey(null, constructor);
       JavassistConstructorInfo info = new JavassistConstructorInfo(key, factory, this, constructor);
       synchronized (constructors)
       {
@@ -730,6 +726,7 @@
     */
    protected MutableMethodInfo generateMethodInfo(SignatureKey key)
    {
+      //TODO This sucks we should instead convert the key to a signature and use the other CtClass.getDeclaredMethod() 
       CtClass[] params = getParameterTypes(key);
       try
       {
@@ -750,12 +747,10 @@
     */
    protected MutableMethodInfo generateMethodInfo(CtMethod method)
    {
-      //Create the signature from the constructor signature directly so we can lazy load parameters
-      //CtBeahavior.getParameterTypes() does not cache the parameters meaning that it is an expensive
+      //Create the signature from the method signature directly so we can lazy load parameters
+      //CtBehavior.getParameterTypes() does not cache the parameters meaning that it is an expensive
       //call needing to hit the class pool to load the CtClass every time 
-      String[] params = getParameterTypeStringsForSignature(method);
-      
-      SignatureKey key = new SignatureKey(method.getName(), params);
+      SignatureKey key = new SignatureKey(method.getName(), method);
       return generateMethodInfo(key, method);
    }
    
@@ -1314,133 +1309,6 @@
       }
    }
 
-   /**
-    * Constructs the parameter strings for a behaviour's signature in the same way
-    * as TypeInfo does
-    * 
-    * @param behaviour
-    * @return the parameter strings
-    */
-   protected String[] getParameterTypeStringsForSignature(CtBehavior behavior)
-   {
-      String desc = behavior.getSignature();
-      String[] args = new String[Descriptor.numOfParameters(desc)];
-
-      int n = 0;
-      int i = 1;
-      do
-      {
-         i = toCtClass(desc, i, args, n++);
-      }
-      while (i > 0 && n < args.length);
-      return args;
-   }
-
-   /**
-    * Put the next argument into the parameter string array 
-    * 
-    * @param desc the beahviour's descriptor
-    * @param i the current index in the descriptor
-    * @param args the parameter string array
-    * @param n the current index of the arguments array
-    */
-   private static int toCtClass(String desc, int i, String[] args, int n)
-   {
-      int i2;
-      String name;
-
-      int arrayDim = 0;
-      char c = desc.charAt(i);
-      if (c == ')')
-         return ++i;
-      while (c == '[')
-      {
-         ++arrayDim;
-         c = desc.charAt(++i);
-      }
-
-      boolean object = false;
-      if (c == 'L')
-      {
-         i2 = desc.indexOf(';', ++i);
-         name = desc.substring(i, i2++).replace('/', '.');
-         object = true;
-      }
-      else
-      {
-         String type = arrayDim == 0 ? toPrimitiveClass(c) : String.valueOf(c);
-
-         i2 = i + 1;
-         if (arrayDim == 0)
-         {
-            args[n] = type;
-            return i2; // neither an array type or a class type
-         }
-         else
-            name = type;
-      }
-
-      if (arrayDim > 0)
-      {
-         StringBuilder sb = new StringBuilder();
-         while (arrayDim-- > 0)
-            sb.append("[");
-
-         if (object)
-            sb.append("L");
-         sb.append(name);
-         if (object)
-            sb.append(";");
-
-         name = sb.toString();
-      }
-
-      args[n] = name;
-      return i2;
-   }
-
-   /**
-    * Convert a
-    */
-   static String toPrimitiveClass(char c)
-   {
-      String type = null;
-      switch (c)
-      {
-         case 'Z' :
-            type = "boolean";
-            break;
-         case 'C' :
-            type = "char";
-            break;
-         case 'B' :
-            type = "byte";
-            break;
-         case 'S' :
-            type = "short";
-            break;
-         case 'I' :
-            type = "int";
-            break;
-         case 'J' :
-            type = "long";
-            break;
-         case 'F' :
-            type = "float";
-            break;
-         case 'D' :
-            type = "double";
-            break;
-         case 'V' :
-            type = "void";
-            break;
-         default :
-            throw new IllegalArgumentException("Unknown primitive type " + c);
-      }
-
-      return type;
-   }
-
    public String getTypeVariable()
    {
       return null;

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeVariableSpy.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeVariableSpy.java	2010-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeVariableSpy.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -21,8 +21,6 @@
 */ 
 package org.jboss.reflect.plugins.javassist;
 
-import javassist.CtBehavior;
-import javassist.CtClass;
 import javassist.bytecode.SignatureAttribute.ClassSignature;
 import javassist.bytecode.SignatureAttribute.MethodSignature;
 import javassist.bytecode.SignatureAttribute.Type;

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistUtil.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistUtil.java	2010-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistUtil.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -22,9 +22,6 @@
 package org.jboss.reflect.plugins.javassist;
 
 import java.lang.reflect.Array;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
 
 import javassist.CannotCompileException;
 import javassist.ClassPool;
@@ -208,29 +205,6 @@
       return field.getDeclaringClass().getName() + "." + field.getName();
    }
    
-   public static Field ctFieldToField(CtField field)
-   {
-      ClassLoader cl = null;
-      try
-      {
-         CtClass declaring = field.getDeclaringClass(); 
-         cl = getClassLoader(declaring);
-         Class<?> realClass = cl.loadClass(declaring.getName());
-         //TODO might need to check if the class is being generated in which case we should call ctClassToClass?
-         
-         
-         return SecurityActions.getDeclaredField(realClass, field.getName());
-      }
-      catch (ClassNotFoundException e)
-      {
-         throw new RuntimeException(field.getDeclaringClass().getName() + " not found in " + cl);
-      }
-      catch (NoSuchFieldException e)
-      {
-         throw new RuntimeException(field.getName() + " not found in " + field.getDeclaringClass().getName() );
-      }
-   }
-
    private static Class<?> loadClass(ClassLoader cl, CtClass ctClass)
    {
       if (ctClass.isPrimitive())
@@ -307,64 +281,4 @@
       
       return null;
    }
-   
-   private static Class<?>[] loadParameters(ClassLoader cl, CtBehavior behavior)
-   {
-      CtClass[] params;
-      try
-      {
-         params = behavior.getParameterTypes();
-      }
-      catch (NotFoundException e)
-      {
-         throw new RuntimeException("Could not determine the parameters for " + behavior + " in " + behavior.getDeclaringClass().getClassPool(), e);
-      }
-      Class<?>[] real = new Class<?>[params.length];
-      
-      for (int i = 0 ; i < params.length ; i++)
-         real[i] = loadClass(cl, params[i]);
-      
-      return real;
-   }
-   
-   public static Method ctMethodToMethod(CtMethod method)
-   {
-      ClassLoader cl = null;
-      try
-      {
-         CtClass declaring = method.getDeclaringClass(); 
-         cl = getClassLoader(declaring);
-         Class<?> realClass = loadClass(cl, declaring);
-         Class<?>[] params = loadParameters(cl, method);
-         
-         return SecurityActions.getDeclaredMethod(realClass, method.getName(), params);
-      }
-      catch (NoSuchMethodException e)
-      {
-         throw new RuntimeException(method.getName() + method.getSignature() + " not found in " + method.getDeclaringClass().getName() );
-      }
-   }
-
-
-   public static Constructor<?> ctConstructorToConstructor(CtConstructor constructor)
-   {
-      ClassLoader cl = null;
-      try
-      {
-         CtClass declaring = constructor.getDeclaringClass(); 
-         cl = getClassLoader(declaring);
-         Class<?> realClass = cl.loadClass(declaring.getName());
-         Class<?>[] params = loadParameters(cl, constructor);
-         
-         return SecurityActions.getDeclaredConstructor(realClass, params);
-      }
-      catch (ClassNotFoundException e)
-      {
-         throw new RuntimeException(constructor.getDeclaringClass().getName() + " not found in " + cl);
-      }
-      catch (NoSuchMethodException e)
-      {
-         throw new RuntimeException(constructor.getName() + constructor.getSignature() + " not found in " + constructor.getDeclaringClass().getName() );
-      }
-   }
 }

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/SecurityActions.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/SecurityActions.java	2010-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/SecurityActions.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -22,7 +22,6 @@
 package org.jboss.reflect.plugins.javassist;
 
 import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
@@ -105,90 +104,6 @@
       }
    }
    
-   static Field getDeclaredField(final Class<?> clazz, final String name) throws NoSuchFieldException
-   {
-      if (System.getSecurityManager() == null)
-         return clazz.getDeclaredField(name);
-      else
-      {
-         try
-         {
-            return AccessController.doPrivileged(new PrivilegedExceptionAction<Field>()
-            {
-               public Field run() throws Exception
-               {
-                  return clazz.getDeclaredField(name);
-               }
-            });
-         }
-         catch (PrivilegedActionException e)
-         {
-            Throwable cause = e.getCause();
-            if (cause instanceof NoSuchFieldException)
-               throw (NoSuchFieldException)cause;
-            if (cause instanceof RuntimeException)
-               throw (RuntimeException)cause;
-            throw new RuntimeException(cause);
-         }
-      }
-   }
-   
-   static Method getDeclaredMethod(final Class<?> clazz, final String name, final Class<?>...parameters) throws NoSuchMethodException
-   {
-      if (System.getSecurityManager() == null)
-         return clazz.getDeclaredMethod(name, parameters);
-      else
-      {
-         try
-         {
-            return AccessController.doPrivileged(new PrivilegedExceptionAction<Method>()
-            {
-               public Method run() throws Exception
-               {
-                  return clazz.getDeclaredMethod(name, parameters);
-               }
-            });
-         }
-         catch (PrivilegedActionException e)
-         {
-            Throwable cause = e.getCause();
-            if (cause instanceof NoSuchFieldException)
-               throw (NoSuchMethodException)cause;
-            if (cause instanceof RuntimeException)
-               throw (RuntimeException)cause;
-            throw new RuntimeException(cause);
-         }
-      }
-   }
-   
-   static Constructor<?> getDeclaredConstructor(final Class<?> clazz, final Class<?>...parameters) throws NoSuchMethodException
-   {
-      if (System.getSecurityManager() == null)
-         return clazz.getDeclaredConstructor(parameters);
-      else
-      {
-         try
-         {
-            return AccessController.doPrivileged(new PrivilegedExceptionAction<Constructor<?>>()
-            {
-               public Constructor<?> run() throws Exception
-               {
-                  return clazz.getDeclaredConstructor( parameters);
-               }
-            });
-         }
-         catch (PrivilegedActionException e)
-         {
-            Throwable cause = e.getCause();
-            if (cause instanceof NoSuchFieldException)
-               throw (NoSuchMethodException)cause;
-            if (cause instanceof RuntimeException)
-               throw (RuntimeException)cause;
-            throw new RuntimeException(cause);
-         }
-      }
-   }
-   
    static Class<?> classForName(final String name) throws ClassNotFoundException
    {
       if (System.getSecurityManager() == null)

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/SignatureKey.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/SignatureKey.java	2010-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/SignatureKey.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -23,6 +23,9 @@
 
 import java.util.Arrays;
 
+import javassist.CtBehavior;
+import javassist.bytecode.Descriptor;
+
 import org.jboss.reflect.spi.TypeInfo;
 import org.jboss.util.JBossStringBuilder;
 
@@ -33,7 +36,7 @@
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision$
  */
-class SignatureKey
+public class SignatureKey
 {
    /** The name */
    String name;
@@ -44,6 +47,8 @@
    /** The cached hashcode */
    private transient int cachedHashCode = Integer.MIN_VALUE;
    
+   private static final String[] NO_PARAMS = new String[0];
+   
    /**
     * Create a new SignatureKey.
     * 
@@ -53,6 +58,7 @@
    public SignatureKey(String name)
    {
       this.name = name;
+      this.params = NO_PARAMS;
    }
    
    /**
@@ -70,19 +76,20 @@
          for (int i = 0; i < typeInfos.length; ++i)
             params[i] = typeInfos[i].getName();
       }
+      else
+         params = NO_PARAMS;
    }
    
    /**
     * Create a new SignatureKey.
     * 
     * @param name the name
-    * @param params the params
+    * @param behavior
     */
-   public SignatureKey(String name, String... params)
+   public SignatureKey(String name, CtBehavior behavior)
    {
       this.name = name;
-      if (params != null && params.length > 0)
-         this.params = params;
+      params = getParameterTypeStringsForSignature(behavior);
    }
    
    @Override
@@ -145,4 +152,149 @@
          return name + "[]";
       return name + Arrays.asList(params);
    }
+   
+   /**
+    * Constructs the parameter strings for a behaviour's signature in the same way
+    * as TypeInfo does
+    * 
+    * @param behaviour
+    * @return the parameter strings
+    */
+   private String[] getParameterTypeStringsForSignature(CtBehavior behavior)
+   {
+      String desc = behavior.getSignature();
+      String[] args = new String[Descriptor.numOfParameters(desc)];
+
+      int n = 0;
+      int i = 1;
+      do
+      {
+         i = getParameterTypeString(desc, i, args, n++);
+      }
+      while (i > 0 && n < args.length);
+      return args;
+   }
+
+   /**
+    * Put the next argument into the parameter string array 
+    * 
+    * @param desc the beahviour's descriptor
+    * @param i the current index in the descriptor
+    * @param args the parameter string array
+    * @param n the current index of the arguments array
+    */
+   private int getParameterTypeString(String desc, int i, String[] args, int n)
+   {
+      int i2;
+      String name;
+
+      int arrayDim = 0;
+      char c = desc.charAt(i);
+      if (c == ')')
+         return ++i;
+      while (c == '[')
+      {
+         ++arrayDim;
+         c = desc.charAt(++i);
+      }
+
+      boolean object = false;
+      if (c == 'L')
+      {
+         i2 = desc.indexOf(';', ++i);
+         name = desc.substring(i, i2++).replace('/', '.');
+         object = true;
+      }
+      else
+      {
+         String type = arrayDim == 0 ? toPrimitiveClass(c) : String.valueOf(c);
+
+         i2 = i + 1;
+         if (arrayDim == 0)
+         {
+            args[n] = type;
+            return i2; // neither an array type or a class type
+         }
+         else
+            name = type;
+      }
+
+      if (arrayDim > 0)
+      {
+         StringBuilder sb = new StringBuilder();
+         while (arrayDim-- > 0)
+            sb.append("[");
+
+         if (object)
+            sb.append("L");
+         sb.append(name);
+         if (object)
+            sb.append(";");
+
+         name = sb.toString();
+      }
+
+      args[n] = name;
+      return i2;
+   }
+
+   /**
+    * Create a primitive entry
+    * 
+    * @param the character for the primitive
+    * @return the primitive real name
+    */
+   private String toPrimitiveClass(char c)
+   {
+      String type = null;
+      switch (c)
+      {
+         case 'Z' :
+            type = "boolean";
+            break;
+         case 'C' :
+            type = "char";
+            break;
+         case 'B' :
+            type = "byte";
+            break;
+         case 'S' :
+            type = "short";
+            break;
+         case 'I' :
+            type = "int";
+            break;
+         case 'J' :
+            type = "long";
+            break;
+         case 'F' :
+            type = "float";
+            break;
+         case 'D' :
+            type = "double";
+            break;
+         case 'V' :
+            type = "void";
+            break;
+         default :
+            throw new IllegalArgumentException("Unknown primitive type " + c);
+      }
+
+      return type;
+   }
+
+   public String[] getParams()
+   {
+      return params;
+   }
+   
+   public boolean isDouble(int i)
+   {
+      return params[i].equals("double");
+   }
+   
+   public boolean isLong(int i)
+   {
+      return params[i].equals("long");
+   }
 }

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/ErrorCheckingMemberFactory.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/ErrorCheckingMemberFactory.java	2010-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/ErrorCheckingMemberFactory.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -28,18 +28,13 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import javassist.CtClass;
-import javassist.CtConstructor;
-import javassist.CtField;
-import javassist.CtMember;
-import javassist.CtMethod;
-import javassist.Modifier;
-import javassist.NotFoundException;
-
 import org.jboss.reflect.plugins.javassist.JavassistConstructor;
+import org.jboss.reflect.plugins.javassist.JavassistConstructorInfo;
 import org.jboss.reflect.plugins.javassist.JavassistField;
+import org.jboss.reflect.plugins.javassist.JavassistFieldInfo;
 import org.jboss.reflect.plugins.javassist.JavassistMethod;
-import org.jboss.reflect.plugins.javassist.JavassistUtil;
+import org.jboss.reflect.plugins.javassist.JavassistMethodInfo;
+import org.jboss.reflect.spi.TypeInfo;
 import org.jboss.util.Strings;
 
 /**
@@ -61,20 +56,12 @@
     * @param method the target method for information about the parameters
     * @return the error checking wrapper 
     */
-   static JavassistMethod wrapInErrorChecker(JavassistMethod m, CtMethod method)
+   static JavassistMethod wrapInErrorChecker(JavassistMethod m, JavassistMethodInfo method)
    {
       if (m == null || method == null)
          throw new IllegalArgumentException("Null method");
       
-      int numParameters = 0;
-      try
-      {
-         numParameters = method.getParameterTypes().length;
-      }
-      catch(NotFoundException e)
-      {
-         throw new IllegalArgumentException("Could not load the parameters for " + method);
-      }
+      int numParameters = method.getSignatureKey().getParams().length;
       
       return new ErrorCheckingJavassistMethod(m, method, numParameters);
    }
@@ -87,20 +74,12 @@
     * @param constructor the target constructor for information about the parameters
     * @return the error checking wrapper 
     */
-   static JavassistConstructor wrapInErrorChecker(JavassistConstructor c, CtConstructor constructor)
+   static JavassistConstructor wrapInErrorChecker(JavassistConstructor c, JavassistConstructorInfo constructor)
    {
       if (c == null || constructor == null)
          throw new IllegalArgumentException("Null constructor");
       
-      int numParameters = 0;
-      try
-      {
-         numParameters = constructor.getParameterTypes().length;
-      }
-      catch(NotFoundException e)
-      {
-         throw new IllegalArgumentException("Could not load the parameters for " + constructor);
-      }
+      int numParameters = constructor.getSignatureKey().getParams().length;
       
       return new ErrorCheckingJavassistConstructor(c, constructor, numParameters);
    }
@@ -113,7 +92,7 @@
     * @param field the target field for information about the parameters
     * @return the error checking wrapper 
     */
-   static JavassistField wrapInErrorChecker(JavassistField f, CtField field)
+   static JavassistField wrapInErrorChecker(JavassistField f, JavassistFieldInfo field)
    {
       if (f == null)
          throw new IllegalArgumentException("Null field");
@@ -130,11 +109,6 @@
       return true;
    }
    
-   private static boolean isStatic(CtMember member)
-   {
-      return Modifier.isStatic(member.getModifiers());
-   }
-   
    private static void handleWrongParameters(String context, String target, Class<?>[] expected, Object[] args)
    {
       List<String> actual = new ArrayList<String>();
@@ -165,20 +139,21 @@
    private static class ErrorCheckingJavassistMethod extends ErrorCheckingMemberFactory implements JavassistMethod
    {
       private final JavassistMethod delegate;
-      private final CtMethod ctMethod;
+      private final JavassistMethodInfo method;
       private final int numParameters;
+      private volatile Method real;
       
-      private ErrorCheckingJavassistMethod(JavassistMethod delegate, CtMethod ctMethod, int numParameters)
+      private ErrorCheckingJavassistMethod(JavassistMethod delegate, JavassistMethodInfo method, int numParameters)
       {
          this.delegate = delegate;
-         this.ctMethod = ctMethod;
+         this.method = method;
          this.numParameters = numParameters;
       }
 
       public Object invoke(Object target, Object[] args) throws Throwable
       {
          if (!checkNumberOfParameters(args, numParameters))
-            throw new IllegalArgumentException("Wrong number of parameters for " + ctMethod.getDeclaringClass() + "." + ctMethod.getName() + ctMethod.getSignature());
+            throw new IllegalArgumentException("Wrong number of parameters for " + method.getDeclaringClass().getName() + "." + method.getName() + method.getDescriptor());
          
          try
          {
@@ -186,58 +161,75 @@
          }
          catch(ClassCastException e)
          {
-            Method method = JavassistUtil.ctMethodToMethod(ctMethod); 
-            if (!isStatic(ctMethod))
+            Method real = getRealMethod();
+            if (!method.isStatic())
             {
-               if (!method.getDeclaringClass().isAssignableFrom(target.getClass()))
-                  handleWrongTarget(target, method.getDeclaringClass(), method.getName());
+               if (!real.getDeclaringClass().isAssignableFrom(target.getClass()))
+                  handleWrongTarget(target, real.getDeclaringClass(), real.getName());
             }
             
-            Class<?>[] params = method.getParameterTypes();
+            Class<?>[] params = real.getParameterTypes();
             for (int i = 0 ; i < args.length ; i++)
             {
                if (!params[i].isAssignableFrom(args[i].getClass()))
-                  handleWrongParameters(method.getName(), Strings.defaultToString(target), method.getParameterTypes(), args);
+                  handleWrongParameters(method.getName(), Strings.defaultToString(target), real.getParameterTypes(), args);
             }
             
             throw e;
          }
          catch(NullPointerException e)
          {
-            Method method = JavassistUtil.ctMethodToMethod(ctMethod); 
-            if (!isStatic(ctMethod) && target == null)
-               handleNullTarget(method);
+            Method real = getRealMethod();
+            if (!method.isStatic() && target == null)
+               handleNullTarget(real);
             
-            CtClass[] parameters = ctMethod.getParameterTypes();
+            Class<?>[] parameters = real.getParameterTypes();
             for (int i = 0 ; i < parameters.length ; i++)
             {
                if (parameters[i].isPrimitive() && args[i] == null)
-                  handleWrongParameters(method.getName(), Strings.defaultToString(target), method.getParameterTypes(), args);
+                  handleWrongParameters(method.getName(), Strings.defaultToString(target), real.getParameterTypes(), args);
             }
             
             throw e;
          }
       }
       
+      private Method getRealMethod() throws Throwable
+      {
+         if (real == null)
+         {
+            Class<?> clazz = method.getDeclaringClass().getType();
+            TypeInfo[] paramTypes = method.getParameterTypes();
+            Class<?>[] params = new Class<?>[paramTypes.length];
+            for (int i = 0 ; i < paramTypes.length ; i++)
+            {
+               params[i] = paramTypes[i].getType();
+            }
+            real = SecurityActions.getDeclaredMethod(clazz, method.getName(), params);
+         }
+         return real;
+      }
+      
    }
 
    private static class ErrorCheckingJavassistConstructor extends ErrorCheckingMemberFactory implements JavassistConstructor
    {
       private final JavassistConstructor delegate;
-      private final CtConstructor ctConstructor;
+      private final JavassistConstructorInfo constructor;
       private final int numParameters;
+      private volatile Constructor<?> real;
       
-      private ErrorCheckingJavassistConstructor(JavassistConstructor delegate, CtConstructor ctConstructor, int numParameters)
+      private ErrorCheckingJavassistConstructor(JavassistConstructor delegate, JavassistConstructorInfo constructor, int numParameters)
       {
          this.delegate = delegate;
-         this.ctConstructor = ctConstructor;
+         this.constructor = constructor;
          this.numParameters = numParameters;
       }
 
       public Object newInstance(Object[] args) throws Throwable
       {
          if (!checkNumberOfParameters(args, numParameters))
-            throw new IllegalArgumentException("Wrong number of parameters for " + ctConstructor.getDeclaringClass() + "." + ctConstructor.getName() + ctConstructor.getSignature());
+            throw new IllegalArgumentException("Wrong number of parameters for " + constructor.getDeclaringClass() + "." + constructor.getName() + constructor.getDescriptor());
          
          try
          {
@@ -245,42 +237,59 @@
          }
          catch(ClassCastException e)
          {
-            Constructor<?> constructor = JavassistUtil.ctConstructorToConstructor(ctConstructor);
-            Class<?>[] params = constructor.getParameterTypes();
+            Constructor<?> real = getRealConstructor();
+            Class<?>[] params = real.getParameterTypes();
             for (int i = 0 ; i < args.length ; i++)
             {
                if (!params[i].isAssignableFrom(args[i].getClass()))
-                  handleWrongParameters("new", Strings.defaultToString(ctConstructor.getDeclaringClass().getName()), constructor.getParameterTypes(), args);
+                  handleWrongParameters("new", Strings.defaultToString(constructor.getDeclaringClass().getName()), real.getParameterTypes(), args);
             }
                
             throw e;
          }
          catch(NullPointerException e)
          {
-            CtClass[] parameters = ctConstructor.getParameterTypes();
+            TypeInfo[] parameters = constructor.getParameterTypes();
             for (int i = 0 ; i < parameters.length ; i++)
             {
                if (parameters[i].isPrimitive() && args[i] == null)
                {
-                  Constructor<?> constructor = JavassistUtil.ctConstructorToConstructor(ctConstructor);
-                  handleWrongParameters("new", Strings.defaultToString(ctConstructor.getDeclaringClass().getName()), constructor.getParameterTypes(), args);
+                  Constructor<?> real = getRealConstructor();
+                  handleWrongParameters("new", Strings.defaultToString(real.getDeclaringClass().getName()), real.getParameterTypes(), args);
                }
             }
             
             throw e;
          }
       }
+      
+      private Constructor<?> getRealConstructor() throws Throwable
+      {
+         if (real == null)
+         {
+            Class<?> clazz = constructor.getDeclaringClass().getType();
+            TypeInfo[] paramTypes = constructor.getParameterTypes();
+            Class<?>[] params = new Class<?>[paramTypes.length];
+            for (int i = 0 ; i < paramTypes.length ; i++)
+            {
+               params[i] = paramTypes[i].getType();
+            }
+            real = SecurityActions.getDeclaredConstructor(clazz, params);
+         }
+         return real;
+      }
    }
 
    private static class ErrorCheckingJavassistField extends ErrorCheckingMemberFactory implements JavassistField
    {
       private final JavassistField delegate;
-      private final CtField ctField;
+      private final JavassistFieldInfo field;
+      private volatile Field real;
       
-      private ErrorCheckingJavassistField(JavassistField delegate, CtField ctField)
+      private ErrorCheckingJavassistField(JavassistField delegate, JavassistFieldInfo field)
       {
          this.delegate = delegate;
-         this.ctField = ctField;
+         this.field = field;
       }
 
       public Object get(Object target) throws Throwable
@@ -291,18 +300,20 @@
          }
          catch (ClassCastException e)
          {
-            Field field = JavassistUtil.ctFieldToField(ctField);
+            Field real = getRealField();
             
-            if (!isStatic(ctField) && !field.getDeclaringClass().isAssignableFrom(target.getClass()))
-               handleWrongTarget(target, field.getDeclaringClass(), field.getName());
+            if (!field.isStatic() && !real.getDeclaringClass().isAssignableFrom(target.getClass()))
+               handleWrongTarget(target, real.getDeclaringClass(), real.getName());
             
             throw e;
          }
          catch(NullPointerException e)
          {
-            Field field = JavassistUtil.ctFieldToField(ctField);
-            if (!isStatic(ctField) && target == null)
-               handleNullTarget(field);
+            if (!field.isStatic() && target == null)
+            {
+               Field real = getRealField();
+               handleNullTarget(real);
+            }
             throw e;
          }
       }
@@ -315,25 +326,39 @@
          }
          catch (ClassCastException e)
          {
-            Field field = JavassistUtil.ctFieldToField(ctField);
-            Class<?> type = field.getType();
+            Field real = getRealField();
+            Class<?> type = real.getType();
 
-            if (!isStatic(ctField) && !field.getDeclaringClass().isAssignableFrom(target.getClass()))
-               handleWrongTarget(target, field.getDeclaringClass(), field.getName());
+            if (!field.isStatic() && !real.getDeclaringClass().isAssignableFrom(target.getClass()))
+               handleWrongTarget(target, real.getDeclaringClass(), real.getName());
 
             if (!type.isAssignableFrom(value.getClass()))
-               throw new IllegalArgumentException("Wrong arguments. Setting " + field.getName() + " for target " + target + " expected=" + field.getType() + " actual=" + value.getClass());
+               throw new IllegalArgumentException("Wrong arguments. Setting " + real.getName() + " for target " + target + " expected=" + real.getType() + " actual=" + value.getClass());
          }
          catch(NullPointerException e)
          {
-            Field field = JavassistUtil.ctFieldToField(ctField);
-            if (!isStatic(ctField) && target == null)
-               handleNullTarget(field);
-            if (ctField.getType().isPrimitive() && value == null)
-               throw new IllegalArgumentException("Null value setting non-static field. " + field);
+            
+            if (!field.isStatic() && target == null)
+            {
+               Field real = getRealField();
+               handleNullTarget(real);
+            }
+            if (field.getType().isPrimitive() && value == null)
+               throw new IllegalArgumentException("Null value setting non-static field. " + real);
             throw e;
          }
       }
+ 
+      private Field getRealField() throws Throwable
+      {
+         if (real == null)
+         {
+            Class<?> clazz = field.getDeclaringClass().getType();
+            real = SecurityActions.getDeclaredField(clazz, field.getName());
+         }
+         return real;
+      }
+   
    }
    
    

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistBehaviorFactory.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistBehaviorFactory.java	2010-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistBehaviorFactory.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -21,12 +21,11 @@
 */ 
 package org.jboss.reflect.plugins.javassist.bytecode;
 
-import javassist.CtBehavior;
-import javassist.CtClass;
-import javassist.NotFoundException;
-
+import org.jboss.reflect.plugins.javassist.JavassistAnnotatedParameterInfo;
 import org.jboss.reflect.plugins.javassist.JavassistConstructor;
 import org.jboss.reflect.plugins.javassist.JavassistMethod;
+import org.jboss.reflect.plugins.javassist.SignatureKey;
+import org.jboss.reflect.spi.TypeInfo;
 
 /**
  * <p>Abstract class to create implementations of the {@link JavassistMethod} and {@link JavassistConstructor}
@@ -41,19 +40,19 @@
 public abstract class JavassistBehaviorFactory extends JavassistMemberFactory
 {
    /** The constructor or method being targeted */
-   CtBehavior ctBehavior;
+   JavassistAnnotatedParameterInfo behavior;
    
    /**
     * Constructor
     * 
     * @param superClass the super class to use for the implementation
-    * @param ctBehavior the method or constructor we are generating a {@link JavassistMethod} or {@link JavassistConstructor} for
+    * @param behavior the method or constructor we are generating a {@link JavassistMethod} or {@link JavassistConstructor} for
     * @param debug true to cause the class bytes to be output to the file system so they can be inspected with a decompiler/javap
     */      
-   JavassistBehaviorFactory(Class<?> superClass, CtBehavior ctBehavior, boolean debug)
+   JavassistBehaviorFactory(Class<?> superClass, JavassistAnnotatedParameterInfo behavior, boolean debug)
    {
       super(superClass, debug);
-      this.ctBehavior = ctBehavior;
+      this.behavior = behavior;
    }
    
    /**
@@ -61,22 +60,15 @@
     * 
     * @return the parameter types
     */
-   CtClass[] getParameterTypes()
+   TypeInfo[] getParameterTypes()
    {
-      try
-      {
-         return ctBehavior.getParameterTypes();
-      }
-      catch (NotFoundException e)
-      {
-         throw new RuntimeException(e);
-      }
+      return behavior.getParameterTypes();
    }
    
    @Override
    String initAccessedMember()
    {
-      return ctBehavior.getDeclaringClass().getName() + "." + ctBehavior.getName() + ctBehavior.getSignature();
+      return behavior.getDeclaringClass().getName() + "." + behavior.getName() + behavior.getDescriptor();
    }
 
    /**
@@ -84,21 +76,27 @@
     * on to the stack
     * 
     * @param cfwc the byte code of the method we are generating
-    * @param params the target parameter types
+    * @param key the target parameter types
     * @param the index of the parameter array
     */
-   void addParameters(ClassFileWriterContext<?> cfwc, CtClass[] params, int parameterIndex)
+   void addParameters(ClassFileWriterContext<?> cfwc, SignatureKey key, int parameterIndex)
    {
+      String[] params = key.getParams();
       for (int i = 0 ; i < params.length ; i++)
       {
          cfwc.addAload(parameterIndex);
          cfwc.addIconst(i);
          cfwc.addAALoad();
          
-         if (!params[i].getName().equals(OBJECT_NAME))
+         if (!params[i].equals(OBJECT_NAME))
          {
             castAndUnbox(cfwc, params[i]);
          }
       }
    }
+   
+   JavassistAnnotatedParameterInfo getBehavior()
+   {
+      return behavior;
+   }
 }

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistConstructorFactory.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistConstructorFactory.java	2010-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistConstructorFactory.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -23,12 +23,12 @@
 
 import java.lang.reflect.Method;
 
-import javassist.CtConstructor;
 import javassist.Modifier;
 import javassist.bytecode.MethodInfo;
 import javassist.util.proxy.RuntimeSupport;
 
 import org.jboss.reflect.plugins.javassist.JavassistConstructor;
+import org.jboss.reflect.plugins.javassist.JavassistConstructorInfo;
 
 /**
  * <p>Class to create implementations of the {{@link JavassistConstructor} interface.</p>
@@ -64,9 +64,6 @@
       methodDescriptors[0] = RuntimeSupport.makeDescriptor(methods[0]); 
    }
 
-   /** The constructor we are targeting */
-   private final CtConstructor ctConstructor;
-   
    /** The name of the class being generated */
    private final String className = JavassistConstructor.class.getName() + counter.incrementAndGet();
    
@@ -77,10 +74,9 @@
     * @param ctConstructor the constructor we are generating a {@link JavassistConstructor} for
     * @param debug true to cause the class bytes to be output to the file system so they can be inspected with a decompiler/javap
     */      
-   JavassistConstructorFactory(Class<?> superClass, CtConstructor ctConstructor, boolean debug)
+   JavassistConstructorFactory(Class<?> superClass, JavassistConstructorInfo constructor, boolean debug)
    {
-      super(superClass, ctConstructor, debug);
-      this.ctConstructor = ctConstructor;
+      super(superClass, constructor, debug);
    }
 
    @Override
@@ -104,13 +100,13 @@
       Method method = methods[index]; 
 
       cfwc.beginMethod(Modifier.PUBLIC, method.getName(), methodDescriptors[index], THROWABLE_EXCEPTIONS);
-
-      cfwc.addNew(ClassFileWriterContext.jvmClassName(ctConstructor.getDeclaringClass()));
+      
+      cfwc.addNew(ClassFileWriterContext.jvmClassName(getBehavior().getDeclaringClass().getName()));
       cfwc.addDup();
       
-      addParameters(cfwc, getParameterTypes(), 1);
+      addParameters(cfwc, getBehavior().getSignatureKey(), 1);
       
-      cfwc.addInvokeSpecial(ClassFileWriterContext.jvmClassName(ctConstructor.getDeclaringClass()), MethodInfo.nameInit, ctConstructor.getSignature());
+      cfwc.addInvokeSpecial(ClassFileWriterContext.jvmClassName(getBehavior().getDeclaringClass().getName()), MethodInfo.nameInit, getBehavior().getDescriptor());
       cfwc.addAReturn();
       
       //We need 3 local variable slots.

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistFieldFactory.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistFieldFactory.java	2010-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistFieldFactory.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -23,13 +23,11 @@
 
 import java.lang.reflect.Method;
 
-import javassist.CtClass;
-import javassist.CtField;
 import javassist.Modifier;
-import javassist.NotFoundException;
 import javassist.util.proxy.RuntimeSupport;
 
 import org.jboss.reflect.plugins.javassist.JavassistField;
+import org.jboss.reflect.plugins.javassist.JavassistFieldInfo;
 
 /**
  * <p>Class to create implementations of the {{@link JavassistField} interface.</p>
@@ -71,7 +69,7 @@
    }
 
    /** The field we are targeting */
-   final CtField ctField;
+   final JavassistFieldInfo field;
    
    /** The name of the class being generated */
    final String className = JavassistField.class.getName() + counter.incrementAndGet();
@@ -80,13 +78,13 @@
     * Constructor
     * 
     * @param superClass the super class to use for the implementation
-    * @param ctField the field we are generating a {@link JavassistField} for
+    * @param field the field we are generating a {@link JavassistField} for
     * @param debug true to cause the class bytes to be output to the file system so they can be inspected with a decompiler/javap
     */      
-   JavassistFieldFactory(Class<?> superClass, CtField ctField, boolean debug)
+   JavassistFieldFactory(Class<?> superClass, JavassistFieldInfo field, boolean debug)
    {
       super(superClass, debug);
-      this.ctField = ctField;
+      this.field = field;
    }
 
    @Override
@@ -101,28 +99,10 @@
       return interfaceNames;
    }
    
-   /**
-    * Gets the type of the field
-    * 
-    * @return the field type
-    */
-   private CtClass getFieldType()
-   {
-      try
-      {
-         return ctField.getType();
-      }
-      catch (NotFoundException e)
-      {
-         // AutoGenerated
-         throw new RuntimeException(e);
-      }
-   }
-   
    @Override
    String getAccessedMember()
    {
-      return ctField.getDeclaringClass().getName() + "." + ctField.getName() + ctField.getSignature();
+      return field.getDeclaringClass().getName() + "." + field.getName() + field.getDescriptor();
    }
 
    @Override
@@ -141,7 +121,7 @@
 
       cfwc.beginMethod(Modifier.PUBLIC, method.getName(), methodDescriptors[index], THROWABLE_EXCEPTIONS);
 
-      boolean isStatic = Modifier.isStatic(ctField.getModifiers());
+      boolean isStatic = Modifier.isStatic(field.getModifiers());
 
       int maxLocals = 0;
       if (index == 0)
@@ -171,17 +151,17 @@
    {
       if (isStatic)
       {
-         cfwc.addGetStatic(ClassFileWriterContext.jvmClassName(ctField.getDeclaringClass()), ctField.getName(), ctField.getSignature());
+         cfwc.addGetStatic(ClassFileWriterContext.jvmClassName(field.getDeclaringClass().getName()), field.getName(), field.getDescriptor());
       }
       else
       {
-         String targetClassName = ClassFileWriterContext.jvmClassName(ctField.getDeclaringClass());
+         String targetClassName = ClassFileWriterContext.jvmClassName(field.getDeclaringClass().getName());
          //push and cast the target object
          cfwc.addAload(1);
          cfwc.addCheckcast(targetClassName);
-         cfwc.addGetField(targetClassName, ctField.getName(), ctField.getSignature());
+         cfwc.addGetField(targetClassName, field.getName(), field.getDescriptor());
       }
-      boxReturnValue(cfwc, getFieldType());
+      boxReturnValue(cfwc, field.getDescriptor());
       cfwc.addAReturn();
    }
    
@@ -191,20 +171,20 @@
       {
          //push and cast the target object
          cfwc.addAload(1);
-         cfwc.addCheckcast(ClassFileWriterContext.jvmClassName(ctField.getDeclaringClass()));
+         cfwc.addCheckcast(ClassFileWriterContext.jvmClassName(field.getDeclaringClass().getName()));
       }
 
       //push and cast the value
       cfwc.addAload(2);
-      castAndUnbox(cfwc, getFieldType());
+      castAndUnbox(cfwc, field.getDescriptor());
       
       if (isStatic)
       {
-         cfwc.addPutStatic(ClassFileWriterContext.jvmClassName(ctField.getDeclaringClass()), ctField.getName(), ctField.getSignature());
+         cfwc.addPutStatic(ClassFileWriterContext.jvmClassName(field.getDeclaringClass().getName()), field.getName(), field.getDescriptor());
       }
       else
       {
-         cfwc.addPutField(ClassFileWriterContext.jvmClassName(ctField.getDeclaringClass()), ctField.getName(), ctField.getSignature());
+         cfwc.addPutField(ClassFileWriterContext.jvmClassName(field.getDeclaringClass().getName()), field.getName(), field.getDescriptor());
       }
 
       cfwc.addAReturn();

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistMemberFactory.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistMemberFactory.java	2010-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistMemberFactory.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -30,22 +30,23 @@
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
 import java.security.ProtectionDomain;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import javassist.CtClass;
-import javassist.CtConstructor;
-import javassist.CtField;
-import javassist.CtMethod;
-import javassist.bytecode.Descriptor;
 import javassist.bytecode.DuplicateMemberException;
 import javassist.util.proxy.RuntimeSupport;
 
 import org.jboss.reflect.plugins.javassist.JavassistConstructor;
+import org.jboss.reflect.plugins.javassist.JavassistConstructorInfo;
 import org.jboss.reflect.plugins.javassist.JavassistField;
+import org.jboss.reflect.plugins.javassist.JavassistFieldInfo;
 import org.jboss.reflect.plugins.javassist.JavassistMethod;
-import org.jboss.util.UnreachableStatementException;
+import org.jboss.reflect.plugins.javassist.JavassistMethodInfo;
+import org.jboss.reflect.plugins.javassist.JavassistTypeInfo;
+import org.jboss.reflect.plugins.javassist.SignatureKey;
 
 /**
  * <p>Abstract base class to create implementations of the {@link JavassistMethod}, {@link JavassistConstructor} 
@@ -63,78 +64,6 @@
    /** Object class name */
    protected static final String OBJECT_NAME = Object.class.getName();
 
-   /** The jvm class name of Short */
-   private static final String SHORT_NAME = ClassFileWriterContext.jvmClassName(Short.class.getName());
-
-   /** The jvm class name of Long */
-   private static final String LONG_NAME = ClassFileWriterContext.jvmClassName(Long.class.getName());
-
-   /** The jvm class name of Integer */
-   private static final String INTEGER_NAME = ClassFileWriterContext.jvmClassName(Integer.class.getName());
-
-   /** The jvm class name of Float */
-   private static final String FLOAT_NAME = ClassFileWriterContext.jvmClassName(Float.class.getName());
-
-   /** The jvm class name of Double */
-   private static final String DOUBLE_NAME = ClassFileWriterContext.jvmClassName(Double.class.getName());
-
-   /** The jvm class name of Character */
-   private static final String CHARACTER_NAME = ClassFileWriterContext.jvmClassName(Character.class.getName());
-
-   /** The jvm class name of Byte */
-   protected static final String BYTE_NAME = ClassFileWriterContext.jvmClassName(Byte.class.getName());
-
-   /** The jvm class name of Boolean */
-   protected static final String BOOLEAN_NAME = ClassFileWriterContext.jvmClassName(Boolean.class.getName());
-
-   /** Descriptor for Boolean.booleanValue() */
-   private final static String BOOLEAN_VALUE_DESCRIPTOR = RuntimeSupport.makeDescriptor(new Class[0], Boolean.TYPE);
-   
-   /** Descriptor for Byte.byteValue() */
-   private final static String BYTE_VALUE_DESCRIPTOR = RuntimeSupport.makeDescriptor(new Class[0], Byte.TYPE); 
-   
-   /** Descriptor for Character.charValue() */
-   private final static String CHAR_VALUE_DESCRIPTOR = RuntimeSupport.makeDescriptor(new Class[0], Character.TYPE);
-   
-   /** Descriptor for Double.doubleValue() */   
-   private final static String DOUBLE_VALUE_DESCRIPTOR = RuntimeSupport.makeDescriptor(new Class[0], Double.TYPE);
-   
-   /** Descriptor for Float.floatValue() */   
-   private final static String FLOAT_VALUE_DESCRIPTOR = RuntimeSupport.makeDescriptor(new Class[0], Float.TYPE);
-   
-   /** Descriptor for Integer.intValue() */   
-   private final static String INTEGER_VALUE_DESCRIPTOR = RuntimeSupport.makeDescriptor(new Class[0], Integer.TYPE); 
-
-   /** Descriptor for Long.longValue() */   
-   private final static String LONG_VALUE_DESCRIPTOR = RuntimeSupport.makeDescriptor(new Class[0], Long.TYPE);
-   
-   /** Descriptor for Short.shortValue() */   
-   private final static String SHORT_VALUE_DESCRIPTOR = RuntimeSupport.makeDescriptor(new Class[0], Short.TYPE);
-   
-   /** Descriptor for Boolean.valueOf */
-   private final static String BOOLEAN_VALUE_OF_DESCRIPTOR = RuntimeSupport.makeDescriptor(new Class[] {Boolean.TYPE}, Boolean.class);
-
-   /** Descriptor for Byte.valueOf */
-   private final static String BYTE_VALUE_OF_DESCRIPTOR = RuntimeSupport.makeDescriptor(new Class[] {Byte.TYPE}, Byte.class);
-
-   /** Descriptor for Character.valueOf */
-   private final static String CHARACTER_VALUE_OF_DESCRIPTOR = RuntimeSupport.makeDescriptor(new Class[] {Character.TYPE}, Character.class);
-
-   /** Descriptor for Double.valueOf */
-   private final static String DOUBLE_VALUE_OF_DESCRIPTOR = RuntimeSupport.makeDescriptor(new Class[] {Double.TYPE}, Double.class);
-
-   /** Descriptor for Float.valueOf */
-   private final static String FLOAT_VALUE_OF_DESCRIPTOR = RuntimeSupport.makeDescriptor(new Class[] {Float.TYPE}, Float.class);
-
-   /** Descriptor for Integer.valueOf */
-   private final static String INTEGER_VALUE_OF_DESCRIPTOR = RuntimeSupport.makeDescriptor(new Class[] {Integer.TYPE}, Integer.class);
-
-   /** Descriptor for Long.valueOf */
-   private final static String LONG_VALUE_OF_DESCRIPTOR = RuntimeSupport.makeDescriptor(new Class[] {Long.TYPE}, Long.class);
-
-   /** Descriptor for Short.valueOf */
-   private final static String SHORT_VALUE_OF_DESCRIPTOR = RuntimeSupport.makeDescriptor(new Class[] {Short.TYPE}, Short.class);
-
    /** Array of exceptions containing jvm name of Throwable */
    protected final static String[] THROWABLE_EXCEPTIONS = new String[] {"java/lang/Throwable"};
    
@@ -193,51 +122,51 @@
    }
    
    /**
-    * Creates a new {@link JavassistMethod} implementation for a given method
+    * Creates a new JavassistMethod implementation for a given method
     * 
     * @param superClass the super class of the JavassistMethod implementation
-    * @param ctMethod the CtMethod for which we want to create a JavassistMethod implementation
+    * @param method the JavassistMethodInfo for which we want to create a JavassistMethod implementation
     * @param debug true if the bytecode should be output to file
     * @return the generated class
     * @throws RuntimeException if an error ocurred
     */
-   public static JavassistMethod createJavassistMethod(Class<?> superClass, CtMethod ctMethod, boolean debug)
+   public static JavassistMethod createJavassistMethod(Class<?> superClass, JavassistMethodInfo method, boolean debug)
    {
-      JavassistMemberFactory factory = new JavassistMethodFactory(superClass, ctMethod, debug);
-      Class<JavassistMethod> member = factory.makeClass(JavassistMethod.class, ctMethod.getDeclaringClass());
-      return ErrorCheckingMemberFactory.wrapInErrorChecker(factory.instantiate(member), ctMethod);
+      JavassistMemberFactory factory = new JavassistMethodFactory(superClass, method, debug);
+      Class<JavassistMethod> member = factory.makeClass(JavassistMethod.class, method.getDeclaringClass());
+      return ErrorCheckingMemberFactory.wrapInErrorChecker(factory.instantiate(member), method);
    }
 
    /**
-    * Creates a new {@link JavassistConstructor} implementation for a given constructor
+    * Creates a new JavassistConstructor implementation for a given constructor
     * 
     * @param superClass the super class of the JavassistConstructor implementation
-    * @param ctConstructor the CtConstructor for which we want to create a JavassistConstructor implementation
+    * @param constructor the JavassistConstructorInfo for which we want to create a JavassistConstructor implementation
     * @param debug true if the bytecode should be output to file
     * @return the generated class
     * @throws RuntimeException if an error ocurred
     */
-   public static JavassistConstructor createJavassistConstructor(Class<?> superClass, CtConstructor ctConstructor, boolean debug)
+   public static JavassistConstructor createJavassistConstructor(Class<?> superClass, JavassistConstructorInfo constructor, boolean debug)
    {
-      JavassistMemberFactory factory = new JavassistConstructorFactory(superClass, ctConstructor, debug);
-      Class<JavassistConstructor> member = factory.makeClass(JavassistConstructor.class, ctConstructor.getDeclaringClass());
-      return ErrorCheckingMemberFactory.wrapInErrorChecker(factory.instantiate(member), ctConstructor);
+      JavassistMemberFactory factory = new JavassistConstructorFactory(superClass, constructor, debug);
+      Class<JavassistConstructor> member = factory.makeClass(JavassistConstructor.class, constructor.getDeclaringClass());
+      return ErrorCheckingMemberFactory.wrapInErrorChecker(factory.instantiate(member), constructor);
    }
 
    /**
-    * Creates a new {@link JavassistField} implementation for a given field
+    * Creates a new JavassistField implementation for a given field
     * 
     * @param superClass the super class of the JavassistField implementation
-    * @param ctField the CtField for which we want to create a JavassistField implementation
+    * @param field the JavassistFieldInfo for which we want to create a JavassistField implementation
     * @param debug true if the bytecode should be output to file
     * @return the generated class
     * @throws RuntimeException if an error ocurred
     */
-   public static JavassistField createJavassistField(Class<?> superClass, CtField ctField, boolean debug)
+   public static JavassistField createJavassistField(Class<?> superClass, JavassistFieldInfo field, boolean debug)
    {
-      JavassistMemberFactory factory = new JavassistFieldFactory(superClass, ctField, debug);
-      Class<JavassistField> member = factory.makeClass(JavassistField.class, ctField.getDeclaringClass());
-      return ErrorCheckingMemberFactory.wrapInErrorChecker(factory.instantiate(member), ctField);
+      JavassistMemberFactory factory = new JavassistFieldFactory(superClass, field, debug);
+      Class<JavassistField> member = factory.makeClass(JavassistField.class, field.getDeclaringClass());
+      return ErrorCheckingMemberFactory.wrapInErrorChecker(factory.instantiate(member), field);
    }
 
    /**
@@ -266,7 +195,7 @@
     * 
     * @return the generated class
     */
-   protected <T> Class<T> makeClass(Class<T> expected, CtClass target)
+   protected <T> Class<T> makeClass(Class<T> expected, JavassistTypeInfo target)
    {
       //Create a new public class
       String name = getGeneratedClassName();
@@ -290,8 +219,8 @@
          throw new RuntimeException("Error creating " + expected.getSimpleName() + " for " + target.getName(), e);
       }
 
-
-      ClassLoader cl = target.getClassPool().getClassLoader();
+      ;
+      ClassLoader cl = target.getClassLoaderInternal();
       if (cl == null)
          cl = SecurityActions.getContextClassLoader();
       
@@ -308,7 +237,7 @@
     *  @return the class
     * 
     */
-   private <T> Class<T> toClass(ClassFileWriterContext<T> cfwc, final CtClass target, ClassLoader cl, ProtectionDomain domain)
+   private <T> Class<T> toClass(ClassFileWriterContext<T> cfwc, final JavassistTypeInfo target, ClassLoader cl, ProtectionDomain domain)
    {
       final ClassLoader actualLoader = PARENT_LOADER_HANDLER.getActualLoader(cl);
       Throwable t = null;
@@ -389,17 +318,19 @@
     * Counts the maximum stack size of the methods being implemented
     * 
     * @param offset the offset
-    * @param params an array containing the parameters being implemented
+    * @param signatureKey the signature key of the parameters being loaded
     * @return the max stack size
     */
-   int countParameterStackSize(int offset, CtClass...params)
+   int countParameterStackSize(int offset, SignatureKey signatureKey)
    {
       int stacksize = offset;
+         
+      String[] params = signatureKey.getParams();
       int n = params.length;
       for (int i = 0; i < n; ++i)
       {
          stacksize++;
-         if (params[i].equals(CtClass.longType) || params[i].equals(CtClass.doubleType))
+         if (signatureKey.isDouble(i) || signatureKey.isLong(i))
             stacksize++;
       }
 
@@ -459,33 +390,18 @@
     * @param type the type to box
     * @return the boxed type name
     */
-   String getBoxedType(CtClass type)
+   String getBoxedType(String type)
    {
-      if (type.isArray())
+      if (type.startsWith("["))
       {
-         return Descriptor.of(type);
+         return type.replace('.', '/');
       }
-      if (type.isPrimitive())
+      Boxing boxing = Boxing.getUnboxer(type);
+      if (boxing != null)
       {
-         if (CtClass.booleanType.equals(type))
-            return BOOLEAN_NAME;
-         else if (CtClass.byteType.equals(type))
-            return BYTE_NAME;
-         else if (CtClass.charType.equals(type))
-            return CHARACTER_NAME;
-         else if (CtClass.doubleType.equals(type))
-            return DOUBLE_NAME;
-         else if (CtClass.floatType.equals(type))
-            return FLOAT_NAME;
-         else if (CtClass.intType.equals(type))
-            return INTEGER_NAME;
-         else if (CtClass.longType.equals(type))
-            return LONG_NAME;
-         else if (CtClass.shortType.equals(type))
-            return SHORT_NAME;
-         throw new UnreachableStatementException();
+         return boxing.getClassName();
       }
-      return type.getName();
+      return type;
    }
 
    /**
@@ -496,55 +412,17 @@
     * @param cfcw the class file writer context of the method/constructor we are creating
     * @param type the target type we want to cast to
     */
-   void castAndUnbox(ClassFileWriterContext<?> cfwc, CtClass type)
+   void castAndUnbox(ClassFileWriterContext<?> cfwc, String type)
    {
-      if (type.getName().equals(OBJECT_NAME))
+      if (type.equals(OBJECT_NAME))
          return;
 
       cfwc.addCheckcast(ClassFileWriterContext.jvmClassName(getBoxedType(type)));
-      if (type.isPrimitive())
+      Boxing unboxer = Boxing.getUnboxer(type);
+      if (unboxer != null)
       {
-         if (CtClass.booleanType.equals(type))
-         {
-            cfwc.addInvokeVirtual(BOOLEAN_NAME, "booleanValue", BOOLEAN_VALUE_DESCRIPTOR);
-            return;
-         }
-         else if (CtClass.byteType.equals(type))
-         {
-            cfwc.addInvokeVirtual(BYTE_NAME, "byteValue", BYTE_VALUE_DESCRIPTOR);
-            return;
-         }
-         else if (CtClass.charType.equals(type))
-         {
-            cfwc.addInvokeVirtual(CHARACTER_NAME, "charValue", CHAR_VALUE_DESCRIPTOR);
-            return;
-         }
-         else if (CtClass.doubleType.equals(type))
-         {
-            cfwc.addInvokeVirtual(DOUBLE_NAME, "doubleValue", DOUBLE_VALUE_DESCRIPTOR);
-            return;
-         }
-         else if (CtClass.floatType.equals(type))
-         {
-            cfwc.addInvokeVirtual(FLOAT_NAME, "floatValue", FLOAT_VALUE_DESCRIPTOR);
-            return;
-         }
-         else if (CtClass.intType.equals(type))
-         {
-            cfwc.addInvokeVirtual(INTEGER_NAME, "intValue", INTEGER_VALUE_DESCRIPTOR);
-            return;
-         }
-         else if (CtClass.longType.equals(type))
-         {
-            cfwc.addInvokeVirtual(LONG_NAME, "longValue", LONG_VALUE_DESCRIPTOR);
-            return;
-         }
-         else if (CtClass.shortType.equals(type))
-         {
-            cfwc.addInvokeVirtual(SHORT_NAME, "shortValue", SHORT_VALUE_DESCRIPTOR);
-            return;
-         }
-         throw new UnreachableStatementException();
+         cfwc.addInvokeVirtual(unboxer.getClassName(), unboxer.getUnboxMethodName(), unboxer.getUnboxMethodDescriptor());
+         
       }
    }
    
@@ -554,51 +432,12 @@
     * @param cfcw the class file writer context of the method/constructor we are creating
     * @param type the type we want to cast to
     */
-   void boxReturnValue(ClassFileWriterContext<?> cfwc, CtClass type)
+   void boxReturnValue(ClassFileWriterContext<?> cfwc, String type)
    {
-      if (type.isPrimitive())
+      Boxing boxing = Boxing.BOXERS.get(type);
+      if (boxing != null)
       {
-         if (CtClass.booleanType.equals(type))
-         {
-            cfwc.addInvokeStatic(BOOLEAN_NAME, "valueOf", BOOLEAN_VALUE_OF_DESCRIPTOR);
-            return;
-         }
-         else if (CtClass.byteType.equals(type))
-         {
-            cfwc.addInvokeStatic(BYTE_NAME, "valueOf", BYTE_VALUE_OF_DESCRIPTOR);
-            return;
-         }
-         else if (CtClass.charType.equals(type))
-         {
-            cfwc.addInvokeStatic(CHARACTER_NAME, "valueOf", CHARACTER_VALUE_OF_DESCRIPTOR);
-            return;
-         }
-         else if (CtClass.doubleType.equals(type))
-         {
-            cfwc.addInvokeStatic(DOUBLE_NAME, "valueOf", DOUBLE_VALUE_OF_DESCRIPTOR);
-            return;
-         }
-         else if (CtClass.floatType.equals(type))
-         {
-            cfwc.addInvokeStatic(FLOAT_NAME, "valueOf", FLOAT_VALUE_OF_DESCRIPTOR);
-            return;
-         }
-         else if (CtClass.intType.equals(type))
-         {
-            cfwc.addInvokeStatic(INTEGER_NAME, "valueOf", INTEGER_VALUE_OF_DESCRIPTOR);
-            return;
-         }
-         else if (CtClass.longType.equals(type))
-         {
-            cfwc.addInvokeStatic(LONG_NAME, "valueOf", LONG_VALUE_OF_DESCRIPTOR);
-            return;
-         }
-         else if (CtClass.shortType.equals(type))
-         {
-            cfwc.addInvokeStatic(SHORT_NAME, "valueOf", SHORT_VALUE_OF_DESCRIPTOR);
-            return;
-         }
-         throw new UnreachableStatementException();
+         cfwc.addInvokeStatic(boxing.getClassName(), boxing.getBoxMethodName(), boxing.getBoxMethodDescriptor());
       }
    }
 
@@ -629,4 +468,88 @@
          return loader;
       }
    }
+
+   private static class Boxing
+   {
+      static final Map<String , Boxing> BOXERS = new HashMap<String, Boxing>();
+      static
+      {
+         BOXERS.put("boolean", new Boxing(ClassFileWriterContext.jvmClassName(Boolean.class.getName()), "booleanValue", 
+               RuntimeSupport.makeDescriptor(new Class[0], Boolean.TYPE), RuntimeSupport.makeDescriptor(new Class[] {Boolean.TYPE}, Boolean.class)));
+         BOXERS.put("Z", BOXERS.get("boolean"));
+         
+         BOXERS.put("byte", new Boxing(ClassFileWriterContext.jvmClassName(Byte.class.getName()), "byteValue", 
+               RuntimeSupport.makeDescriptor(new Class[0], Byte.TYPE), RuntimeSupport.makeDescriptor(new Class[] {Byte.TYPE}, Byte.class)));
+         BOXERS.put("B", BOXERS.get("byte"));
+         
+         BOXERS.put("char", new Boxing(ClassFileWriterContext.jvmClassName(Character.class.getName()), "charValue",
+               RuntimeSupport.makeDescriptor(new Class[0], Character.TYPE), RuntimeSupport.makeDescriptor(new Class[] {Character.TYPE}, Character.class)));
+         BOXERS.put("C", BOXERS.get("char"));
+         
+         BOXERS.put("double", new Boxing(ClassFileWriterContext.jvmClassName(Double.class.getName()), "doubleValue", 
+               RuntimeSupport.makeDescriptor(new Class[0], Double.TYPE), RuntimeSupport.makeDescriptor(new Class[] {Double.TYPE}, Double.class)));
+         BOXERS.put("D", BOXERS.get("double"));
+         
+         BOXERS.put("float", new Boxing(ClassFileWriterContext.jvmClassName(Float.class.getName()), "floatValue", 
+               RuntimeSupport.makeDescriptor(new Class[0], Float.TYPE), RuntimeSupport.makeDescriptor(new Class[] {Float.TYPE}, Float.class)));
+         BOXERS.put("F", BOXERS.get("float"));
+         
+         BOXERS.put("int", new Boxing(ClassFileWriterContext.jvmClassName(Integer.class.getName()), "intValue", 
+               RuntimeSupport.makeDescriptor(new Class[0], Integer.TYPE), RuntimeSupport.makeDescriptor(new Class[] {Integer.TYPE}, Integer.class)));
+         BOXERS.put("I", BOXERS.get("int"));
+         
+         BOXERS.put("long", new Boxing(ClassFileWriterContext.jvmClassName(Long.class.getName()), "longValue", 
+               RuntimeSupport.makeDescriptor(new Class[0], Long.TYPE), RuntimeSupport.makeDescriptor(new Class[] {Long.TYPE}, Long.class)));
+         BOXERS.put("J", BOXERS.get("long"));
+         
+         BOXERS.put("short", new Boxing(ClassFileWriterContext.jvmClassName(Short.class.getName()), "shortValue", 
+               RuntimeSupport.makeDescriptor(new Class[0], Short.TYPE), RuntimeSupport.makeDescriptor(new Class[] {Short.TYPE}, Short.class)));
+         BOXERS.put("S", BOXERS.get("short"));
+      }
+      
+      private String className;
+      private String unboxMethodName;
+      private String unboxMethodDescriptor;
+      private String boxMethodDescriptor;
+      
+      static Boxing getUnboxer(String primitive)
+      {
+         return BOXERS.get(primitive);
+      }
+      
+      public Boxing(String className, String methodName, String unboxMethodDescriptor, String boxMethodDescriptor)
+      {
+         this.className = className;
+         this.unboxMethodName = methodName;
+         this.unboxMethodDescriptor = unboxMethodDescriptor;
+         this.boxMethodDescriptor = boxMethodDescriptor;
+      }
+
+      String getClassName()
+      {
+         return className;
+      }
+      
+      String getUnboxMethodName()
+      {
+         return unboxMethodName;
+      }
+   
+      String getUnboxMethodDescriptor()
+      {
+         return unboxMethodDescriptor;
+      }
+      
+      String getBoxMethodName()
+      {
+         return "valueOf";
+      }
+      
+      String getBoxMethodDescriptor()
+      {
+         return boxMethodDescriptor;
+      }
+   }
+   
+   
 }
\ No newline at end of file

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistMethodFactory.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistMethodFactory.java	2010-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistMethodFactory.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -23,13 +23,11 @@
 
 import java.lang.reflect.Method;
 
-import javassist.CtClass;
-import javassist.CtMethod;
 import javassist.Modifier;
-import javassist.NotFoundException;
 import javassist.util.proxy.RuntimeSupport;
 
 import org.jboss.reflect.plugins.javassist.JavassistMethod;
+import org.jboss.reflect.plugins.javassist.JavassistMethodInfo;
 
 /**
  * <p>Class to create implementations of the {@link JavassistMethod} interface.</p>
@@ -67,9 +65,6 @@
       methodDescriptors[0] = RuntimeSupport.makeDescriptor(methods[0]);
    }
 
-   /** The method we are targeting */
-   private final CtMethod ctMethod;
-   
    /** The name of the class being generated */
    private final String className = JavassistMethod.class.getName() + counter.incrementAndGet();
    
@@ -78,13 +73,12 @@
     * Constructor
     * 
     * @param superClass the super class to use for the implementation
-    * @param ctMethod the constructor we are generating a {@link JavassistMethod} for
+    * @param method the constructor we are generating a {@link JavassistMethod} for
     * @param debug true to cause the class bytes to be output to the file system so they can be inspected with a decompiler/javap
     */      
-   JavassistMethodFactory(Class<?> superClass, CtMethod ctMethod, boolean debug)
+   JavassistMethodFactory(Class<?> superClass, JavassistMethodInfo method, boolean debug)
    {
-      super(superClass, ctMethod, debug);
-      this.ctMethod = ctMethod;
+      super(superClass, method, debug);
    }
 
    String getGeneratedClassName()
@@ -103,16 +97,11 @@
     * 
     * @return the target type
     */
-   private CtClass getReturnType()
+   private String getReturnType()
    {
-      try
-      {
-         return ctMethod.getReturnType();
-      }
-      catch (NotFoundException e)
-      {
-         throw new RuntimeException(e);
-      }
+      String desc = getBehavior().getDescriptor();
+      int i = desc.indexOf(')');
+      return desc.substring(i +1);
    }
 
    @Override
@@ -125,9 +114,9 @@
       
       cfwc.beginMethod(Modifier.PUBLIC, method.getName(), methodDescriptors[index], THROWABLE_EXCEPTIONS);
  
-      boolean isStatic = Modifier.isStatic(ctBehavior.getModifiers());
+      boolean isStatic = Modifier.isStatic(behavior.getModifiers());
       
-      String targetClassName = ClassFileWriterContext.jvmClassName(ctMethod.getDeclaringClass());
+      String targetClassName = ClassFileWriterContext.jvmClassName(getBehavior().getDeclaringClass().getName());
       if (!isStatic)
       {
          //push and cast the target object
@@ -135,18 +124,18 @@
          cfwc.addCheckcast(targetClassName);
       }
       
-      addParameters(cfwc, getParameterTypes(), 2);
+      addParameters(cfwc, getBehavior().getSignatureKey(), 2);
       
       if (isStatic)
-         cfwc.addInvokeStatic(targetClassName, ctMethod.getName(), ctMethod.getSignature());
-      else if (ctMethod.getDeclaringClass().isInterface())
+         cfwc.addInvokeStatic(targetClassName, getBehavior().getName(), getBehavior().getDescriptor());
+      else if (getBehavior().getDeclaringClass().isInterface())
       {
-         cfwc.addInvokeInterface(targetClassName, ctMethod.getName(), ctMethod.getSignature(), countParameterStackSize(0, getParameterTypes()));
+         cfwc.addInvokeInterface(targetClassName, getBehavior().getName(), getBehavior().getDescriptor(), countParameterStackSize(0, getBehavior().getSignatureKey()));
       }
       else
-         cfwc.addInvokeVirtual(targetClassName, ctMethod.getName(), ctMethod.getSignature());
+         cfwc.addInvokeVirtual(targetClassName, getBehavior().getName(), getBehavior().getDescriptor());
       
-      if (getReturnType() == CtClass.voidType)
+      if (getReturnType().equals("V"))
       {
          //return null
          cfwc.addAConstNull();

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/SecurityActions.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/SecurityActions.java	2010-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/SecurityActions.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -23,6 +23,7 @@
 
 import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.security.AccessController;
@@ -88,32 +89,6 @@
       }
    }
 
-   static Method getDeclaredMethod(final Class<?> clazz, final String methodName, final Class<?>...classes) throws NoSuchMethodException
-   {
-      if (System.getSecurityManager() == null)
-         return clazz.getDeclaredMethod(methodName, classes);
-      else
-      {
-         try
-         {
-            return AccessController.doPrivileged(new PrivilegedExceptionAction<Method>()
-            {
-               public Method run() throws Exception
-               {
-                  return clazz.getDeclaredMethod(methodName, classes);
-               }
-            });
-         }
-         catch (PrivilegedActionException e)
-         {
-            Exception ex = e.getException();
-            if (ex instanceof NoSuchMethodException)
-               throw (NoSuchMethodException)ex;
-            throw new RuntimeException(e);
-         }
-      }
-   }
-   
    static void setAccessible(final AccessibleObject member)
    {
       if (System.getSecurityManager() == null)
@@ -156,4 +131,90 @@
          throw new RuntimeException(e.getCause());
       }
    }
+   
+   static Field getDeclaredField(final Class<?> clazz, final String name) throws NoSuchFieldException
+   {
+      if (System.getSecurityManager() == null)
+         return clazz.getDeclaredField(name);
+      else
+      {
+         try
+         {
+            return AccessController.doPrivileged(new PrivilegedExceptionAction<Field>()
+            {
+               public Field run() throws Exception
+               {
+                  return clazz.getDeclaredField(name);
+               }
+            });
+         }
+         catch (PrivilegedActionException e)
+         {
+            Throwable cause = e.getCause();
+            if (cause instanceof NoSuchFieldException)
+               throw (NoSuchFieldException)cause;
+            if (cause instanceof RuntimeException)
+               throw (RuntimeException)cause;
+            throw new RuntimeException(cause);
+         }
+      }
+   }
+   
+   static Method getDeclaredMethod(final Class<?> clazz, final String name, final Class<?>...parameters) throws NoSuchMethodException
+   {
+      if (System.getSecurityManager() == null)
+         return clazz.getDeclaredMethod(name, parameters);
+      else
+      {
+         try
+         {
+            return AccessController.doPrivileged(new PrivilegedExceptionAction<Method>()
+            {
+               public Method run() throws Exception
+               {
+                  return clazz.getDeclaredMethod(name, parameters);
+               }
+            });
+         }
+         catch (PrivilegedActionException e)
+         {
+            Throwable cause = e.getCause();
+            if (cause instanceof NoSuchFieldException)
+               throw (NoSuchMethodException)cause;
+            if (cause instanceof RuntimeException)
+               throw (RuntimeException)cause;
+            throw new RuntimeException(cause);
+         }
+      }
+   }
+   
+   static Constructor<?> getDeclaredConstructor(final Class<?> clazz, final Class<?>...parameters) throws NoSuchMethodException
+   {
+      if (System.getSecurityManager() == null)
+         return clazz.getDeclaredConstructor(parameters);
+      else
+      {
+         try
+         {
+            return AccessController.doPrivileged(new PrivilegedExceptionAction<Constructor<?>>()
+            {
+               public Constructor<?> run() throws Exception
+               {
+                  return clazz.getDeclaredConstructor( parameters);
+               }
+            });
+         }
+         catch (PrivilegedActionException e)
+         {
+            Throwable cause = e.getCause();
+            if (cause instanceof NoSuchFieldException)
+               throw (NoSuchMethodException)cause;
+            if (cause instanceof RuntimeException)
+               throw (RuntimeException)cause;
+            throw new RuntimeException(cause);
+         }
+      }
+   }
+   
+   
 }

Modified: projects/jboss-reflect/trunk/src/test/java/org/jboss/test/plugins/javassist/bytecode/test/AbstractJavassistMemberFactoryTest.java
===================================================================
--- projects/jboss-reflect/trunk/src/test/java/org/jboss/test/plugins/javassist/bytecode/test/AbstractJavassistMemberFactoryTest.java	2010-05-20 15:34:41 UTC (rev 105059)
+++ projects/jboss-reflect/trunk/src/test/java/org/jboss/test/plugins/javassist/bytecode/test/AbstractJavassistMemberFactoryTest.java	2010-05-20 17:08:47 UTC (rev 105060)
@@ -21,14 +21,6 @@
 */ 
 package org.jboss.test.plugins.javassist.bytecode.test;
 
-import java.util.Arrays;
-
-import javassist.ClassPool;
-import javassist.CtClass;
-import javassist.CtConstructor;
-import javassist.CtField;
-import javassist.CtMethod;
-
 import org.jboss.reflect.plugins.javassist.JavassistConstructor;
 import org.jboss.reflect.plugins.javassist.JavassistConstructorInfo;
 import org.jboss.reflect.plugins.javassist.JavassistField;
@@ -100,6 +92,8 @@
    
    protected abstract class TestMemberFactory 
    {
+      TypeInfoFactory factory = new JavassistTypeInfoFactory();
+            
       abstract JavassistConstructor createConstructor(Class<?> clazz, Class<?>...params) throws Exception;
       
       abstract JavassistMethod createMethod(Class<?> clazz, String name, Class<?>...params) throws Exception;
@@ -129,106 +123,73 @@
          }
          return clazz;
       }
-   }
-   
-   protected class JavassistTestMemberFactory extends TestMemberFactory
-   {
-      public JavassistConstructor createConstructor(Class<?> clazz, Class<?>...params) throws Exception
-      {
-         return JavassistMemberFactory.createJavassistConstructor(MAGIC_ACCESSOR_IMPL, getCtConstructor(clazz, params), DEBUG);
-      }
       
-      public JavassistMethod createMethod(Class<?> clazz, String name, Class<?>...params) throws Exception
+      
+      private ClassInfo getClassInfo(Class<?> clazz)
       {
-         return JavassistMemberFactory.createJavassistMethod(MAGIC_ACCESSOR_IMPL, getCtMethod(clazz, name, params), DEBUG);
+         return assertInstanceOf(factory.getTypeInfo(clazz), ClassInfo.class);
       }
       
-      public JavassistField createField(Class<?> clazz, String name) throws Exception
+      private TypeInfo[] getParams(Class<?>...params)
       {
-         return JavassistMemberFactory.createJavassistField(MAGIC_ACCESSOR_IMPL, getCtField(clazz, name), DEBUG);
+         TypeInfo[] infos = new TypeInfo[params.length];
+         for (int i = 0 ; i < infos.length ; i++)
+            infos[i] = factory.getTypeInfo(checkPrimitive(params[i]));
+         return infos;
       }
       
-      private CtClass getCtClass(Class<?> clazz) throws Exception
+      protected JavassistConstructorInfo getConstructor(Class<?> clazz, Class<?>...params) throws Exception
       {
-         clazz = checkPrimitive(clazz);
-         return ClassPool.getDefault().getCtClass(clazz.getName());
+         ClassInfo info = getClassInfo(clazz);
+         return assertInstanceOf(info.getDeclaredConstructor(getParams(params)), JavassistConstructorInfo.class);
       }
-      
-      private CtClass[] getCtClasses(Class<?>...classes) throws Exception
+
+      protected JavassistMethodInfo getMethod(Class<?> clazz, String name, Class<?>...params) throws Exception
       {
-         CtClass[] ctClasses = new CtClass[classes.length];
+         ClassInfo info = getClassInfo(clazz);
+         return assertInstanceOf(info.getDeclaredMethod(name, getParams(params)), JavassistMethodInfo.class);
+      }
 
-         for (int i = 0 ; i < classes.length ; i++)
-         {
-            ctClasses[i] = getCtClass(classes[i]);
-         }
-         return ctClasses;
+      public JavassistFieldInfo getField(Class<?> clazz, String name) throws Exception
+      {
+         ClassInfo info = getClassInfo(clazz);
+         return assertInstanceOf(info.getDeclaredField(name), JavassistFieldInfo.class);
       }
-      
-      private CtConstructor getCtConstructor(Class<?> clazz, Class<?>...params) throws Exception
+   }
+   
+   protected class JavassistTestMemberFactory extends TestMemberFactory
+   {
+      public JavassistConstructor createConstructor(Class<?> clazz, Class<?>...params) throws Exception
       {
-         CtClass ct = getCtClass(clazz);
-         CtClass[] ctParams = getCtClasses(params);
-         for (CtConstructor ctor : ct.getConstructors())
-         {
-            if (Arrays.equals(ctParams, ctor.getParameterTypes()))
-               return ctor;
-         }
-         fail("No constructor found");
-         return null;
+         return JavassistMemberFactory.createJavassistConstructor(MAGIC_ACCESSOR_IMPL, getConstructor(clazz, params), DEBUG);
       }
       
-      private CtMethod getCtMethod(Class<?> clazz, String name, Class<?>...params) throws Exception
+      public JavassistMethod createMethod(Class<?> clazz, String name, Class<?>...params) throws Exception
       {
-         CtClass ct = getCtClass(clazz);
-         CtClass[] ctParams = getCtClasses(params);
-         return ct.getDeclaredMethod(name, ctParams);
+         return JavassistMemberFactory.createJavassistMethod(MAGIC_ACCESSOR_IMPL, getMethod(clazz, name, params), DEBUG);
       }
       
-      private CtField getCtField(Class<?> clazz, String name) throws Exception
+      public JavassistField createField(Class<?> clazz, String name) throws Exception
       {
-         CtClass ct = getCtClass(clazz);
-         return ct.getDeclaredField(name);
+         return JavassistMemberFactory.createJavassistField(MAGIC_ACCESSOR_IMPL, getField(clazz, name), DEBUG);
       }
-
    }
 
    protected class DefaultTestMemberFactory extends TestMemberFactory
    {
-      TypeInfoFactory factory = new JavassistTypeInfoFactory();
-      
       public JavassistConstructor createConstructor(Class<?> clazz, Class<?>...params) throws Exception
       {
-         ClassInfo info = getClassInfo(clazz);
-         JavassistConstructorInfo constructorInfo = assertInstanceOf(info.getDeclaredConstructor(getParams(params)), JavassistConstructorInfo.class);
-         return DefaultMemberFactory.createJavassistConstructor(constructorInfo);
+         return DefaultMemberFactory.createJavassistConstructor(getConstructor(clazz, params));
       }
       
       public JavassistMethod createMethod(Class<?> clazz, String name, Class<?>...params) throws Exception
       {
-         ClassInfo info = getClassInfo(clazz);
-         JavassistMethodInfo methodInfo = assertInstanceOf(info.getDeclaredMethod(name, getParams(params)), JavassistMethodInfo.class);
-         return DefaultMemberFactory.createJavassistMethod(methodInfo);
+         return DefaultMemberFactory.createJavassistMethod(getMethod(clazz, name, params));
       }
       
       public JavassistField createField(Class<?> clazz, String name) throws Exception
       {
-         ClassInfo info = getClassInfo(clazz);
-         JavassistFieldInfo fieldInfo = assertInstanceOf(info.getDeclaredField(name), JavassistFieldInfo.class);
-         return DefaultMemberFactory.createJavassistField(fieldInfo);
+         return DefaultMemberFactory.createJavassistField(getField(clazz, name));
       }
-      
-      private ClassInfo getClassInfo(Class<?> clazz)
-      {
-         return assertInstanceOf(factory.getTypeInfo(clazz), ClassInfo.class);
-      }
-      
-      private TypeInfo[] getParams(Class<?>...params)
-      {
-         TypeInfo[] infos = new TypeInfo[params.length];
-         for (int i = 0 ; i < infos.length ; i++)
-            infos[i] = factory.getTypeInfo(checkPrimitive(params[i]));
-         return infos;
-      }
    }
 }




More information about the jboss-cvs-commits mailing list