[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