[jboss-cvs] JBossAS SVN: r103926 - projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Tue Apr 13 13:28:02 EDT 2010
Author: kabir.khan at jboss.com
Date: 2010-04-13 13:28:02 -0400 (Tue, 13 Apr 2010)
New Revision: 103926
Modified:
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/AbstractJavassistBody.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/DefaultJavassistBody.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/InsertAfterJavassistBody.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/InsertBeforeJavassistBody.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedInfo.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedParameterInfo.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotationInfo.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistArrayInfoImpl.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/JavassistEnumInfo.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/JavassistInheritableAnnotationHolder.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/JavassistParameterInfo.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/JavassistTypeInfoFactoryImpl.java
Log:
[JBREFLECT-5] Make fields final/volatile in the javassist implementation. Fix obvious concurrency issues, and eliminate some duplicate code
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/AbstractJavassistBody.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/AbstractJavassistBody.java 2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/AbstractJavassistBody.java 2010-04-13 17:28:02 UTC (rev 103926)
@@ -33,7 +33,7 @@
*/
public abstract class AbstractJavassistBody implements Body
{
- String body;
+ private final String body;
AbstractJavassistBody(String body)
{
@@ -44,6 +44,6 @@
return body;
}
- abstract void createBody(CtBehavior behaviour);
+ abstract void createBody(CtBehavior behaviour);
}
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/DefaultJavassistBody.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/DefaultJavassistBody.java 2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/DefaultJavassistBody.java 2010-04-13 17:28:02 UTC (rev 103926)
@@ -39,7 +39,7 @@
}
@Override
- void createBody(CtBehavior behavior)
+ void createBody(CtBehavior behavior)
{
try
{
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/InsertAfterJavassistBody.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/InsertAfterJavassistBody.java 2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/InsertAfterJavassistBody.java 2010-04-13 17:28:02 UTC (rev 103926)
@@ -39,7 +39,7 @@
}
@Override
- void createBody(CtBehavior behavior)
+ void createBody(CtBehavior behavior)
{
try
{
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/InsertBeforeJavassistBody.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/InsertBeforeJavassistBody.java 2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/InsertBeforeJavassistBody.java 2010-04-13 17:28:02 UTC (rev 103926)
@@ -37,8 +37,9 @@
{
super(body);
}
+
@Override
- void createBody(CtBehavior behavior)
+ void createBody(CtBehavior behavior)
{
try
{
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedInfo.java 2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedInfo.java 2010-04-13 17:28:02 UTC (rev 103926)
@@ -46,12 +46,12 @@
private static final HashMap<String, AnnotationValue> EMPTY_ANNOTATION_MAP = new HashMap<String, AnnotationValue>();
/** The annotations */
- protected AnnotationValue[] annotationsArray = NOT_CONFIGURED;
+ protected volatile AnnotationValue[] annotationsArray = NOT_CONFIGURED;
/** Annotations map Map<String, AnnotationValue> */
- protected HashMap<String, AnnotationValue> annotationMap;
+ protected volatile HashMap<String, AnnotationValue> annotationMap;
- protected AnnotationHelper annotationHelper;
+ protected final AnnotationHelper annotationHelper;
public JavassistAnnotatedInfo(AnnotationHelper annotationHelper)
{
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-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedParameterInfo.java 2010-04-13 17:28:02 UTC (rev 103926)
@@ -22,11 +22,20 @@
package org.jboss.reflect.plugins.javassist;
import java.lang.annotation.Annotation;
+import java.lang.reflect.Modifier;
+import javassist.CannotCompileException;
+import javassist.CtBehavior;
+import javassist.CtClass;
+import javassist.NotFoundException;
+import javassist.bytecode.SignatureAttribute.MethodSignature;
+
import org.jboss.reflect.plugins.AnnotationHelper;
import org.jboss.reflect.spi.AnnotationInfo;
import org.jboss.reflect.spi.AnnotationValue;
+import org.jboss.reflect.spi.Body;
import org.jboss.reflect.spi.ClassInfo;
+import org.jboss.reflect.spi.ModifierInfo;
import org.jboss.reflect.spi.ParameterInfo;
import org.jboss.reflect.spi.TypeInfo;
@@ -41,22 +50,122 @@
private static final long serialVersionUID = -494071110672611729L;
/** The parameters */
- protected transient ParameterInfo[] parameters;
+ protected transient volatile ParameterInfo[] parameters;
/** The parameter types */
- protected transient TypeInfo[] parameterTypes;
+ protected transient volatile TypeInfo[] parameterTypes;
/** The exception types */
- protected transient ClassInfo[] exceptionTypes;
+ protected transient volatile ClassInfo[] exceptionTypes;
/** The type info */
- protected JavassistTypeInfo typeInfo;
+ protected final JavassistTypeInfo typeInfo;
+
+ /** The constructor or method */
+ protected final CtBehavior ctBehavior;
- public JavassistAnnotatedParameterInfo(AnnotationHelper annotationHelper)
+
+ public JavassistAnnotatedParameterInfo(AnnotationHelper annotationHelper, JavassistTypeInfo typeInfo, CtBehavior ctBehavior)
{
super(annotationHelper);
+ this.typeInfo = typeInfo;
+ this.ctBehavior = ctBehavior;
}
+ public int getModifiers()
+ {
+ return ctBehavior.getModifiers();
+ }
+
+ public boolean isPublic()
+ {
+ return Modifier.isPublic(ctBehavior.getModifiers());
+ }
+
+ public boolean isStatic()
+ {
+ return Modifier.isStatic(ctBehavior.getModifiers());
+ }
+
+ public boolean isVolatile()
+ {
+ return Modifier.isVolatile(ctBehavior.getModifiers());
+ }
+
+ public ClassInfo getDeclaringClass()
+ {
+ return typeInfo;
+ }
+
+ public ClassInfo[] getExceptionTypes()
+ {
+ if (exceptionTypes == null)
+ {
+ try
+ {
+ CtClass[] types = ctBehavior.getExceptionTypes();
+ ClassInfo[] exceptionTypes = new ClassInfo[types.length];
+ for (int i = 0; i < types.length; ++i)
+ exceptionTypes[i] = (ClassInfo) typeInfo.getFactory().getTypeInfo(types[i]);
+
+ this.exceptionTypes = exceptionTypes;
+ }
+ catch (NotFoundException e)
+ {
+ throw JavassistTypeInfoFactoryImpl.raiseClassNotFound("for exception types of constructor", e);
+ }
+ }
+ return exceptionTypes;
+ }
+
+ protected synchronized void generateParameters()
+ {
+ if (parameters != null)
+ return;
+
+ try
+ {
+ MethodSignature sig = JavassistHelper.getMethodSignature(ctBehavior);
+ if (sig != null && sig.getParameterTypes().length == ctBehavior.getParameterTypes().length)
+ {
+ parameterTypes = JavassistHelper.createParameterTypes(ctBehavior, sig, typeInfo);
+ }
+ else
+ {
+ CtClass[] types = ctBehavior.getParameterTypes();
+ parameterTypes = new TypeInfo[types.length];
+ for (int i = 0; i < types.length; ++i)
+ parameterTypes[i] = typeInfo.getFactory().getTypeInfo(types[i]);
+ }
+ parameters = new ParameterInfo[parameterTypes.length];
+ for (int i = 0; i < parameterTypes.length; ++i)
+ parameters[i] = new JavassistParameterInfo(annotationHelper, this, i, parameterTypes[i]);
+ }
+ catch (NotFoundException e)
+ {
+ throw JavassistTypeInfoFactoryImpl.raiseClassNotFound("for parameters of constructor", e);
+ }
+ }
+
+ public ParameterInfo[] getParameters()
+ {
+ if (parameters == null)
+ generateParameters();
+ return parameters;
+ }
+
+ public TypeInfo[] getParameterTypes()
+ {
+ if (parameterTypes == null)
+ generateParameters();
+ return parameterTypes;
+ }
+
+ public AnnotationValue[] getAnnotations()
+ {
+ return getAnnotations(ctBehavior);
+ }
+
protected void setupParameterAnnotations(Object[][] annotations)
{
for (int param = 0 ; param < annotations.length ; param++)
@@ -73,6 +182,92 @@
}
}
- protected abstract void createParameterAnnotations();
+ protected void createParameterAnnotations()
+ {
+ try
+ {
+ Object[][] parameterAnnotations = ctBehavior.getParameterAnnotations();
+ setupParameterAnnotations(parameterAnnotations);
+ }
+ catch (ClassNotFoundException e)
+ {
+ // AutoGenerated
+ throw new RuntimeException(e);
+ }
+ }
+ public void setBody(Body body)
+ {
+ typeInfo.clearMethodCache();
+ if (body instanceof AbstractJavassistBody == false)
+ {
+ throw new IllegalArgumentException("Body is not an instance of AbstractJavassistBody");
+ }
+ ((AbstractJavassistBody)body).createBody(ctBehavior);
+ }
+
+ public void setExceptions(String[] exceptions)
+ {
+ typeInfo.clearMethodCache();
+ try
+ {
+ ctBehavior.setExceptionTypes(JavassistUtil.toCtClass(typeInfo.getCtClass().getClassPool(), exceptions));
+ }
+ catch (NotFoundException e)
+ {
+ throw new org.jboss.reflect.spi.NotFoundException(e.toString());
+ }
+ }
+
+ public void setExceptions(ClassInfo[] exceptions)
+ {
+ try
+ {
+ ctBehavior.setExceptionTypes(JavassistUtil.toCtClass(exceptions));
+ }
+ catch (NotFoundException e)
+ {
+ throw new org.jboss.reflect.spi.NotFoundException(e.toString());
+ }
+ typeInfo.clearMethodCache();
+ }
+
+ public void setModifier(ModifierInfo mi)
+ {
+ ctBehavior.setModifiers(mi.getModifiers());
+ typeInfo.clearMethodCache();
+ }
+
+ public void setParameters(String[] parameters)
+ {
+ for(String p : parameters)
+ {
+ try
+ {
+ ctBehavior.addParameter(JavassistUtil.toCtClass(typeInfo.getCtClass().getClassPool(), p));
+ }
+ catch (CannotCompileException e)
+ {
+ throw new org.jboss.reflect.spi.CannotCompileException(e.toString());
+ }
+ }
+ typeInfo.clearMethodCache();
+ }
+
+ public void setParameters(ClassInfo[] parameters)
+ {
+ for(ClassInfo clazz : parameters)
+ {
+ try
+ {
+ ctBehavior.addParameter(JavassistUtil.toCtClass(clazz));
+ }
+ catch (CannotCompileException e)
+ {
+ throw new org.jboss.reflect.spi.CannotCompileException(e.toString());
+ }
+ }
+ typeInfo.clearMethodCache();
+ }
+
}
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotationInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotationInfo.java 2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotationInfo.java 2010-04-13 17:28:02 UTC (rev 103926)
@@ -41,10 +41,10 @@
private static final long serialVersionUID = 3546645408219542832L;
/** The attributes */
- protected AnnotationAttribute[] attributes;
+ protected volatile AnnotationAttribute[] attributes;
/** Attribute Map<String, AnnotationAttribute> */
- protected HashMap<String, AnnotationAttribute> attributeMap;
+ protected volatile HashMap<String, AnnotationAttribute> attributeMap;
public JavassistAnnotationInfo(JavassistTypeInfoFactoryImpl factory, CtClass ctClass, Class<? extends Object> clazz)
{
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistArrayInfoImpl.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistArrayInfoImpl.java 2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistArrayInfoImpl.java 2010-04-13 17:28:02 UTC (rev 103926)
@@ -50,10 +50,10 @@
private volatile int modifiers;
/** The component type */
- protected TypeInfo componentType;
+ protected final TypeInfo componentType;
/** The hash code */
- protected int hash = -1;
+ protected final int hash;
private static String getName(TypeInfo componentType)
{
@@ -90,7 +90,7 @@
{
super(factory, getName(componentType), ctClass, clazz);
this.componentType = componentType;
- calculateHash();
+ hash = calculateHash();
}
@Override
@@ -137,11 +137,11 @@
/**
* Calculate the hash code
*/
- protected void calculateHash()
+ protected int calculateHash()
{
int result = super.hashCode();
result = 29 * result + componentType.hashCode();
- hash = result;
+ return result;
}
@Override
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-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistConstructorInfo.java 2010-04-13 17:28:02 UTC (rev 103926)
@@ -21,24 +21,13 @@
*/
package org.jboss.reflect.plugins.javassist;
-import java.lang.reflect.Modifier;
import java.util.Arrays;
-import javassist.CannotCompileException;
-import javassist.CtClass;
import javassist.CtConstructor;
-import javassist.NotFoundException;
-import javassist.bytecode.SignatureAttribute.MethodSignature;
import org.jboss.reflect.plugins.AnnotationHelper;
-import org.jboss.reflect.spi.AnnotationValue;
-import org.jboss.reflect.spi.Body;
-import org.jboss.reflect.spi.ClassInfo;
import org.jboss.reflect.spi.ConstructorInfo;
-import org.jboss.reflect.spi.ModifierInfo;
import org.jboss.reflect.spi.MutableConstructorInfo;
-import org.jboss.reflect.spi.ParameterInfo;
-import org.jboss.reflect.spi.TypeInfo;
import org.jboss.util.JBossStringBuilder;
/**
@@ -62,11 +51,8 @@
/** The reflection factory */
private static final JavassistReflectionFactory reflectionFactory = new JavassistReflectionFactory(true);
- /** The constructor */
- private CtConstructor ctConstructor;
-
/** The constructor implementation */
- private transient JavassistConstructor constructor;
+ private transient volatile JavassistConstructor constructor;
/**
* Create a new JavassistConstructorInfo.
@@ -77,73 +63,17 @@
*/
public JavassistConstructorInfo(AnnotationHelper annotationHelper, JavassistTypeInfo typeInfo, CtConstructor ctConstructor)
{
- super(annotationHelper);
- this.typeInfo = typeInfo;
- this.ctConstructor = ctConstructor;
+ super(annotationHelper, typeInfo, ctConstructor);
}
- public int getModifiers()
- {
- return ctConstructor.getModifiers();
- }
-
- public boolean isPublic()
- {
- return Modifier.isPublic(ctConstructor.getModifiers());
- }
-
- public boolean isStatic()
- {
- return Modifier.isStatic(ctConstructor.getModifiers());
- }
-
- public boolean isVolatile()
- {
- return Modifier.isVolatile(ctConstructor.getModifiers());
- }
-
- public ClassInfo getDeclaringClass()
- {
- return typeInfo;
- }
-
- public ClassInfo[] getExceptionTypes()
- {
- if (exceptionTypes == null)
- {
- try
- {
- CtClass[] types = ctConstructor.getExceptionTypes();
- exceptionTypes = new ClassInfo[types.length];
- for (int i = 0; i < types.length; ++i)
- exceptionTypes[i] = (ClassInfo) typeInfo.getFactory().getTypeInfo(types[i]);
- }
- catch (NotFoundException e)
- {
- throw JavassistTypeInfoFactoryImpl.raiseClassNotFound("for exception types of constructor", e);
- }
- }
- return exceptionTypes;
- }
-
- public ParameterInfo[] getParameters()
- {
- if (parameters == null)
- generateParameters();
- return parameters;
- }
-
- public TypeInfo[] getParameterTypes()
- {
- if (parameterTypes == null)
- generateParameters();
- return parameterTypes;
- }
-
public Object newInstance(Object[] args) throws Throwable
{
if (constructor == null)
- constructor = reflectionFactory.createConstructor(ctConstructor);
+ {
+ JavassistConstructor ctor = reflectionFactory.createConstructor((CtConstructor)ctBehavior);
+ if (constructor == null)
+ constructor = ctor;
+ }
JavassistAccessController.checkAccess(this);
@@ -154,7 +84,8 @@
protected int getHashCode()
{
int result = getDeclaringClass().hashCode();
- generateParameters();
+ if (parameters == null)
+ generateParameters();
if (parameterTypes != null)
{
for (int i = 0; i < parameterTypes.length; i++)
@@ -186,131 +117,8 @@
super.toString(buffer);
}
- /**
- * Generate parameters
- */
- protected void generateParameters()
- {
- try
- {
- MethodSignature sig = JavassistHelper.getMethodSignature(ctConstructor);
- if (sig != null && sig.getParameterTypes().length == ctConstructor.getParameterTypes().length)
- {
- parameterTypes = JavassistHelper.createParameterTypes(ctConstructor, sig, typeInfo);
- }
- else
- {
- CtClass[] types = ctConstructor.getParameterTypes();
- parameterTypes = new TypeInfo[types.length];
- for (int i = 0; i < types.length; ++i)
- parameterTypes[i] = typeInfo.getFactory().getTypeInfo(types[i]);
- }
- parameters = new ParameterInfo[parameterTypes.length];
- for (int i = 0; i < parameterTypes.length; ++i)
- parameters[i] = new JavassistParameterInfo(annotationHelper, this, i, parameterTypes[i]);
- }
- catch (NotFoundException e)
- {
- throw JavassistTypeInfoFactoryImpl.raiseClassNotFound("for parameters of constructor", e);
- }
- }
-
- public AnnotationValue[] getAnnotations()
- {
- return getAnnotations(ctConstructor);
- }
-
- @Override
- protected void createParameterAnnotations()
- {
- try
- {
- Object[][] parameterAnnotations = ctConstructor.getParameterAnnotations();
- super.setupParameterAnnotations(parameterAnnotations);
- }
- catch (ClassNotFoundException e)
- {
- // AutoGenerated
- throw new RuntimeException(e);
- }
- }
-
protected CtConstructor getCtConstructor()
{
- return ctConstructor;
+ return (CtConstructor)ctBehavior;
}
-
- public void setBody(Body body)
- {
- if (body instanceof AbstractJavassistBody == false)
- {
- throw new IllegalArgumentException("Body is not an instance of AbstractJavassistBody");
- }
- ((AbstractJavassistBody)body).createBody(ctConstructor);
- typeInfo.clearConstructorCache();
- }
-
- public void setExceptions(String[] exceptions)
- {
- try
- {
- ctConstructor.setExceptionTypes(JavassistUtil.toCtClass(typeInfo.getCtClass().getClassPool(), exceptions));
- }
- catch (NotFoundException e)
- {
- throw new org.jboss.reflect.spi.NotFoundException(e.toString());
- }
- typeInfo.clearConstructorCache();
- }
-
- public void setExceptions(ClassInfo[] exceptions)
- {
- try
- {
- ctConstructor.setExceptionTypes(JavassistUtil.toCtClass(exceptions));
- }
- catch (NotFoundException e)
- {
- throw new org.jboss.reflect.spi.NotFoundException(e.toString());
- }
- typeInfo.clearConstructorCache();
- }
-
- public void setModifier(ModifierInfo mi)
- {
- typeInfo.clearMethodCache();
- ctConstructor.setModifiers(mi.getModifiers());
- }
-
- public void setParameters(String[] parameters)
- {
- for(String p : parameters)
- {
- try
- {
- ctConstructor.addParameter(JavassistUtil.toCtClass(typeInfo.getCtClass().getClassPool(), p));
- }
- catch (CannotCompileException e)
- {
- throw new org.jboss.reflect.spi.CannotCompileException(e.toString());
- }
- }
- typeInfo.clearConstructorCache();
- }
-
- public void setParameters(ClassInfo[] parameters)
- {
- for(ClassInfo clazz : parameters)
- {
- try
- {
- ctConstructor.addParameter(JavassistUtil.toCtClass(clazz));
- }
- catch (CannotCompileException e)
- {
- throw new org.jboss.reflect.spi.CannotCompileException(e.toString());
- }
- }
- typeInfo.clearConstructorCache();
- }
}
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistEnumInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistEnumInfo.java 2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistEnumInfo.java 2010-04-13 17:28:02 UTC (rev 103926)
@@ -40,10 +40,10 @@
private static final long serialVersionUID = 3546645408219542832L;
/** Enumeration constants */
- protected EnumConstantInfoImpl[] enumConstants;
+ protected volatile EnumConstantInfoImpl[] enumConstants;
/** The constants */
- protected HashMap<String, EnumConstantInfo> constants = new HashMap<String, EnumConstantInfo>();
+ protected final HashMap<String, EnumConstantInfo> constants = new HashMap<String, EnumConstantInfo>();
/**
* Create a new JavassistEnumInfo.
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-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistFieldInfo.java 2010-04-13 17:28:02 UTC (rev 103926)
@@ -60,16 +60,16 @@
private static final JavassistReflectionFactory reflectionFactory = new JavassistReflectionFactory(true);
/** The field */
- private CtField ctField;
+ private final CtField ctField;
/** The field implementation */
- private transient JavassistField field;
+ private transient volatile JavassistField field;
/** The type */
- private transient TypeInfo fieldType;
+ private transient volatile TypeInfo fieldType;
/** The type info */
- protected JavassistTypeInfo typeInfo;
+ protected final JavassistTypeInfo typeInfo;
/**
* Create a new JavassistFieldInfo.
@@ -125,11 +125,13 @@
if (type != null)
{
ClassSignature sig = JavassistHelper.getClassSignature(ctField.getDeclaringClass());
- return typeInfo.getFactory().getTypeInfo(typeInfo.getClassLoaderInternal(), type, JavassistTypeVariableSpy.createForField(sig));
+ fieldType = typeInfo.getFactory().getTypeInfo(typeInfo.getClassLoaderInternal(), type, JavassistTypeVariableSpy.createForField(sig));
}
-
- CtClass clazz = ctField.getType();
- fieldType = typeInfo.getFactory().getTypeInfo(clazz);
+ else
+ {
+ CtClass clazz = ctField.getType();
+ fieldType = typeInfo.getFactory().getTypeInfo(clazz);
+ }
return fieldType;
}
catch (NotFoundException e)
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistInheritableAnnotationHolder.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistInheritableAnnotationHolder.java 2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistInheritableAnnotationHolder.java 2010-04-13 17:28:02 UTC (rev 103926)
@@ -44,12 +44,14 @@
private static final String INHERITED_NAME = Inherited.class.getName();//This
/** All annotations Map<String, AnnotationValue> */
- protected Map<String, AnnotationValue> allAnnotations;
+ protected volatile Map<String, AnnotationValue> allAnnotations;
/** All annotations */
- protected AnnotationValue[] allAnnotationsArray = NOT_CONFIGURED;
+ protected volatile AnnotationValue[] allAnnotationsArray = NOT_CONFIGURED;
+
+ protected boolean initialized;
- protected CtClass ctClass;
+ protected final CtClass ctClass;
public JavassistInheritableAnnotationHolder(CtClass ctClass, AnnotationHelper annotationHelper)
{
@@ -67,13 +69,17 @@
@Override
protected AnnotationValue[] getAnnotations(Object obj)
{
- synchronized (this)
+ if (!initialized)
{
- if (allAnnotationsArray == NOT_CONFIGURED)
+ synchronized (this)
{
- allAnnotationsArray = annotationHelper.getAnnotations(obj);
- setupAnnotations(allAnnotationsArray);
-
+ if (!initialized)
+ {
+ AnnotationValue[] allAnnotations = annotationHelper.getAnnotations(obj);
+ allAnnotationsArray = allAnnotations;
+ setupAnnotations(allAnnotations);
+ initialized = true;
+ }
}
}
return allAnnotationsArray;
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-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistMethodInfo.java 2010-04-13 17:28:02 UTC (rev 103926)
@@ -21,11 +21,8 @@
*/
package org.jboss.reflect.plugins.javassist;
-import java.lang.reflect.Modifier;
import java.util.Arrays;
-import javassist.CannotCompileException;
-import javassist.CtBehavior;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;
@@ -33,14 +30,10 @@
import javassist.bytecode.SignatureAttribute.MethodSignature;
import org.jboss.reflect.plugins.AnnotationHelper;
-import org.jboss.reflect.spi.AnnotationValue;
-import org.jboss.reflect.spi.Body;
import org.jboss.reflect.spi.ClassInfo;
import org.jboss.reflect.spi.MethodInfo;
-import org.jboss.reflect.spi.ModifierInfo;
import org.jboss.reflect.spi.MutableMethodInfo;
import org.jboss.reflect.spi.MutableMethodInfoCommand;
-import org.jboss.reflect.spi.ParameterInfo;
import org.jboss.reflect.spi.TypeInfo;
import org.jboss.util.JBossStringBuilder;
@@ -66,11 +59,8 @@
/** The reflection factory */
private static final JavassistReflectionFactory reflectionFactory = new JavassistReflectionFactory(true);
- /** The method */
- private CtMethod ctMethod;
-
/** The method implementation */
- private transient JavassistMethod method;
+ private transient volatile JavassistMethod method;
/** The return type */
private transient TypeInfo returnType;
@@ -84,14 +74,13 @@
*/
public JavassistMethodInfo(AnnotationHelper annotationHelper, JavassistTypeInfo typeInfo, CtMethod ctMethod)
{
- super(annotationHelper);
- this.typeInfo = typeInfo;
- this.ctMethod = ctMethod;
+ super(annotationHelper, typeInfo, ctMethod);
+ //this.ctMethod = ctMethod;
}
public String getName()
{
- return ctMethod.getName();
+ return ((CtMethod)ctBehavior).getName();
}
public ClassInfo getDeclaringClass()
@@ -99,51 +88,13 @@
return typeInfo;
}
- public int getModifiers()
- {
- return ctMethod.getModifiers();
- }
-
- public boolean isPublic()
- {
- return Modifier.isPublic(getModifiers());
- }
-
- public boolean isStatic()
- {
- return Modifier.isStatic(getModifiers());
- }
-
- public boolean isVolatile()
- {
- return Modifier.isVolatile(getModifiers());
- }
-
- public ClassInfo[] getExceptionTypes()
- {
- if (exceptionTypes == null)
- {
- try
- {
- CtClass[] types = ctMethod.getExceptionTypes();
- exceptionTypes = new ClassInfo[types.length];
- for (int i = 0; i < types.length; ++i)
- exceptionTypes[i] = (ClassInfo) typeInfo.getFactory().getTypeInfo(types[i]);
- }
- catch (NotFoundException e)
- {
- throw JavassistTypeInfoFactoryImpl.raiseClassNotFound("for exception types of method " + getName(), e);
- }
- }
- return exceptionTypes;
- }
-
public TypeInfo getReturnType()
{
if (returnType != null)
return returnType;
try
{
+ CtMethod ctMethod = (CtMethod)ctBehavior;
MethodSignature sig = JavassistHelper.getMethodSignature(ctMethod);
if (sig != null)
{
@@ -160,24 +111,10 @@
}
}
- public ParameterInfo[] getParameters()
- {
- if (parameters == null)
- generateParameters();
- return parameters;
- }
-
- public TypeInfo[] getParameterTypes()
- {
- if (parameterTypes == null)
- generateParameters();
- return parameterTypes;
- }
-
public Object invoke(Object target, Object[] args) throws Throwable
{
if (method == null)
- method = reflectionFactory.createMethod(ctMethod);
+ method = reflectionFactory.createMethod((CtMethod)ctBehavior);
JavassistAccessController.checkAccess(this);
@@ -221,61 +158,7 @@
buffer.append("name=").append(getName());
super.toString(buffer);
}
-
- /**
- * Generate parameters
- */
- protected void generateParameters()
- {
- try
- {
- MethodSignature sig = JavassistHelper.getMethodSignature(ctMethod);
- if (sig != null && sig.getParameterTypes().length == ctMethod.getParameterTypes().length)
- {
- parameterTypes = JavassistHelper.createParameterTypes(ctMethod, sig, typeInfo);
- }
- else
- {
- CtClass[] types = ctMethod.getParameterTypes();
- parameterTypes = new TypeInfo[types.length];
- for (int i = 0; i < types.length; ++i)
- parameterTypes[i] = typeInfo.getFactory().getTypeInfo(types[i]);
- }
- parameters = new ParameterInfo[parameterTypes.length];
- for (int i = 0; i < parameterTypes.length; ++i)
- parameters[i] = new JavassistParameterInfo(annotationHelper, this, i, parameterTypes[i]);
- }
- catch (NotFoundException e)
- {
- throw JavassistTypeInfoFactoryImpl.raiseClassNotFound("for parameters of " + getName(), e);
- }
- }
-
- public AnnotationValue[] getAnnotations()
- {
- return getAnnotations(ctMethod);
- }
- protected CtBehavior getParameterizedObject()
- {
- return ctMethod;
- }
-
- @Override
- protected void createParameterAnnotations()
- {
- try
- {
- Object[][] parameterAnnotations = ctMethod.getParameterAnnotations();
- super.setupParameterAnnotations(parameterAnnotations);
- }
- catch (ClassNotFoundException e)
- {
- // AutoGenerated
- throw new RuntimeException(e);
- }
- }
-
//TODO: need to be implemented...
public void executeCommand(MutableMethodInfoCommand mmc)
{
@@ -283,89 +166,15 @@
public CtMethod getCtMethod()
{
- return ctMethod;
+ return (CtMethod)ctBehavior;
}
- public void setBody(Body body)
- {
- typeInfo.clearMethodCache();
- if (body instanceof AbstractJavassistBody == false)
- {
- throw new IllegalArgumentException("Body is not an instance of AbstractJavassistBody");
- }
- ((AbstractJavassistBody)body).createBody(ctMethod);
- }
-
- public void setExceptions(String[] exceptions)
- {
- typeInfo.clearMethodCache();
- try
- {
- ctMethod.setExceptionTypes(JavassistUtil.toCtClass(typeInfo.getCtClass().getClassPool(), exceptions));
- }
- catch (NotFoundException e)
- {
- throw new org.jboss.reflect.spi.NotFoundException(e.toString());
- }
- }
-
- public void setExceptions(ClassInfo[] exceptions)
- {
- try
- {
- ctMethod.setExceptionTypes(JavassistUtil.toCtClass(exceptions));
- }
- catch (NotFoundException e)
- {
- throw new org.jboss.reflect.spi.NotFoundException(e.toString());
- }
- typeInfo.clearMethodCache();
- }
-
- public void setModifier(ModifierInfo mi)
- {
- ctMethod.setModifiers(mi.getModifiers());
- typeInfo.clearMethodCache();
- }
-
public void setName(String name)
{
- ctMethod.setName(name);
+ ((CtMethod)ctBehavior).setName(name);
typeInfo.clearMethodCache();
}
- public void setParameters(String[] parameters)
- {
- for(String p : parameters)
- {
- try
- {
- ctMethod.addParameter(JavassistUtil.toCtClass(typeInfo.getCtClass().getClassPool(), p));
- }
- catch (CannotCompileException e)
- {
- throw new org.jboss.reflect.spi.CannotCompileException(e.toString());
- }
- }
- typeInfo.clearMethodCache();
- }
-
- public void setParameters(ClassInfo[] parameters)
- {
- for(ClassInfo clazz : parameters)
- {
- try
- {
- ctMethod.addParameter(JavassistUtil.toCtClass(clazz));
- }
- catch (CannotCompileException e)
- {
- throw new org.jboss.reflect.spi.CannotCompileException(e.toString());
- }
- }
- typeInfo.clearMethodCache();
- }
-
public void setReturnType(String returnType)
{
throw new RuntimeException("Method not supported by Javassist");
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistParameterInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistParameterInfo.java 2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistParameterInfo.java 2010-04-13 17:28:02 UTC (rev 103926)
@@ -39,13 +39,13 @@
private static final long serialVersionUID = 7388866103874412735L;
/** The annotated info */
- private JavassistAnnotatedParameterInfo annotated;
+ private final JavassistAnnotatedParameterInfo annotated;
/** The name */
- private String name;
+ private final String name;
/** The paramter type */
- private TypeInfo parameterType;
+ private final TypeInfo parameterType;
/**
* Create a new JavassistParameterInfo.
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-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfo.java 2010-04-13 17:28:02 UTC (rev 103926)
@@ -34,7 +34,6 @@
import java.util.concurrent.CopyOnWriteArrayList;
import javassist.CannotCompileException;
-import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
@@ -80,36 +79,36 @@
private JavassistTypeInfoFactoryImpl factory;
/** The name */
- private String name;
+ private final String name;
/** The class */
- private Class<? extends Object> clazz;
+ private volatile Class<? extends Object> clazz;
/** The constructors */
- private Map<SignatureKey, JavassistConstructorInfo> constructors = new ConcurrentHashMap<SignatureKey, JavassistConstructorInfo>();
+ private final Map<SignatureKey, JavassistConstructorInfo> constructors = new ConcurrentHashMap<SignatureKey, JavassistConstructorInfo>();
/** The constructors */
- private MutableConstructorInfo[] constructorArray;
+ private volatile MutableConstructorInfo[] constructorArray;
/** The fields */
- private Map<String, JavassistFieldInfo> fields = new ConcurrentHashMap<String, JavassistFieldInfo>();
+ private final Map<String, JavassistFieldInfo> fields = new ConcurrentHashMap<String, JavassistFieldInfo>();
/** The fields */
- private MutableFieldInfo[] fieldArray;
+ private volatile MutableFieldInfo[] fieldArray;
/** The methods */
- private Map<SignatureKey, JavassistMethodInfo> methods = new ConcurrentHashMap<SignatureKey, JavassistMethodInfo>();
+ private final Map<SignatureKey, JavassistMethodInfo> methods = new ConcurrentHashMap<SignatureKey, JavassistMethodInfo>();
- private Map<SignatureKey, List<JavassistMethodInfo>> volatileMethods = new HashMap<SignatureKey, List<JavassistMethodInfo>>();
+ private final Map<SignatureKey, List<JavassistMethodInfo>> volatileMethods = new HashMap<SignatureKey, List<JavassistMethodInfo>>();
/** The methods */
- private MutableMethodInfo[] methodArray;
+ private volatile MutableMethodInfo[] methodArray;
/** The package info */
- private PackageInfo packageInfo;
+ private volatile PackageInfo packageInfo;
/** The attachments */
- private transient TypeInfoAttachments attachments;
+ private transient volatile TypeInfoAttachments attachments;
/** The generic super class */
private volatile ClassInfo genericSuperClass = ClassInfoImpl.UNKNOWN_CLASS;
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java 2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java 2010-04-13 17:28:02 UTC (rev 103926)
@@ -41,7 +41,6 @@
import javassist.bytecode.SignatureAttribute.ArrayType;
import javassist.bytecode.SignatureAttribute.BaseType;
import javassist.bytecode.SignatureAttribute.ClassType;
-import javassist.bytecode.SignatureAttribute.NestedClassType;
import javassist.bytecode.SignatureAttribute.ObjectType;
import javassist.bytecode.SignatureAttribute.TypeArgument;
More information about the jboss-cvs-commits
mailing list