[jboss-cvs] JBossAS SVN: r105870 - in projects/jboss-reflect/trunk/src/main/java/org/jboss: reflect/plugins and 3 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Wed Jun 9 10:03:58 EDT 2010
Author: kabir.khan at jboss.com
Date: 2010-06-09 10:03:57 -0400 (Wed, 09 Jun 2010)
New Revision: 105870
Added:
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/MethodInfoInternal.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/CachingLoadClassClassLoaderFinder.java
Modified:
projects/jboss-reflect/trunk/src/main/java/org/jboss/beans/info/plugins/AbstractBeanInfoFactory.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/MethodInfoImpl.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/BytecodeMethodInfo.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/BytecodeTypeInfoFactoryImpl.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/ClassLoaderFinder.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/bytes/asm/Util.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistMethodInfo.java
Log:
[JBREFLECT-125] Add internal interface to get length of parameters without loading them
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/beans/info/plugins/AbstractBeanInfoFactory.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/beans/info/plugins/AbstractBeanInfoFactory.java 2010-06-09 13:55:31 UTC (rev 105869)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/beans/info/plugins/AbstractBeanInfoFactory.java 2010-06-09 14:03:57 UTC (rev 105870)
@@ -36,6 +36,7 @@
import org.jboss.beans.info.spi.EventInfo;
import org.jboss.beans.info.spi.PropertyInfo;
import org.jboss.classadapter.spi.ClassAdapter;
+import org.jboss.reflect.plugins.MethodInfoInternal;
import org.jboss.reflect.spi.AnnotationValue;
import org.jboss.reflect.spi.ClassInfo;
import org.jboss.reflect.spi.ConstructorInfo;
@@ -65,12 +66,15 @@
//Don't load these until we verified the name since this hits the classpools for the javassist impl
//and we want things to be as lazy as possible
TypeInfo returnType = minfo.getReturnType();
- TypeInfo[] parameters = minfo.getParameterTypes();
+
// isBoolean() is not a getter for java.lang.Boolean
if (name.startsWith("is") && PrimitiveInfo.BOOLEAN.equals(returnType) == false)
return false;
- if (parameters.length == 0 && PrimitiveInfo.VOID.equals(returnType) == false)
+
+ //Again, try to find the length of the parameters without loading up the types
+ int params = minfo instanceof MethodInfoInternal ? ((MethodInfoInternal)minfo).getNumberParameters() : minfo.getParameterTypes().length;
+ if (params == 0 && PrimitiveInfo.VOID.equals(returnType) == false)
return true;
}
return false;
@@ -84,9 +88,11 @@
//Don't load these until we verified the name since this hits the classpools for the javassist impl
//and we want things to be as lazy as possible
TypeInfo returnType = minfo.getReturnType();
- TypeInfo[] parameters = minfo.getParameterTypes();
- if (parameters.length == 1 && PrimitiveInfo.VOID.equals(returnType))
+ //Again, try to find the length of the parameters without loading up the types
+ int params = minfo instanceof MethodInfoInternal ? ((MethodInfoInternal)minfo).getNumberParameters() : minfo.getParameterTypes().length;
+
+ if (params == 1 && PrimitiveInfo.VOID.equals(returnType))
return true;
}
return false;
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/MethodInfoImpl.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/MethodInfoImpl.java 2010-06-09 13:55:31 UTC (rev 105869)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/MethodInfoImpl.java 2010-06-09 14:03:57 UTC (rev 105870)
@@ -38,7 +38,7 @@
* @author <a href="mailto:bill at jboss.org">Bill Burke</a>
* @author <a href="mailto:adrian at jboss.org">Adrian Brock</a>
*/
-public class MethodInfoImpl extends AnnotationHolder implements MethodInfo
+public class MethodInfoImpl extends AnnotationHolder implements MethodInfo, MethodInfoInternal
{
/** serialVersionUID */
private static final long serialVersionUID = 3257007670035756341L;
@@ -245,4 +245,9 @@
{
hash = name.hashCode();
}
+
+ public int getNumberParameters()
+ {
+ return getParameterTypes().length;
+ }
}
Added: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/MethodInfoInternal.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/MethodInfoInternal.java (rev 0)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/MethodInfoInternal.java 2010-06-09 14:03:57 UTC (rev 105870)
@@ -0,0 +1,32 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.reflect.plugins;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public interface MethodInfoInternal
+{
+ int getNumberParameters();
+}
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/BytecodeMethodInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/BytecodeMethodInfo.java 2010-06-09 13:55:31 UTC (rev 105869)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/BytecodeMethodInfo.java 2010-06-09 14:03:57 UTC (rev 105870)
@@ -27,6 +27,7 @@
import javassist.bytecode.SignatureAttribute.MethodSignature;
import org.jboss.reflect.plugins.AnnotationHelper;
+import org.jboss.reflect.plugins.MethodInfoInternal;
import org.jboss.reflect.plugins.bytecode.accessor.MemberAccessorFactory;
import org.jboss.reflect.plugins.bytecode.accessor.MethodAccessor;
import org.jboss.reflect.plugins.bytecode.bytes.MethodBytes;
@@ -48,7 +49,7 @@
* @version $Revision: 105101 $
* @see MutableMethodInfo
*/
-public class BytecodeMethodInfo extends BytecodeBehaviourInfo implements MethodInfo
+public class BytecodeMethodInfo extends BytecodeBehaviourInfo implements MethodInfo, MethodInfoInternal
{
/** The serialVersionUID */
private static final long serialVersionUID = 101183748227690112L;
@@ -76,6 +77,11 @@
return behaviour.getName();
}
+ public int getNumberParameters()
+ {
+ return getSignatureKey().getParams().length;
+ }
+
public TypeInfo getReturnType()
{
if (returnType != null)
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/BytecodeTypeInfoFactoryImpl.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/BytecodeTypeInfoFactoryImpl.java 2010-06-09 13:55:31 UTC (rev 105869)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/BytecodeTypeInfoFactoryImpl.java 2010-06-09 14:03:57 UTC (rev 105870)
@@ -104,7 +104,8 @@
{
if (finder == null)
{
- this.finder = ClassLoaderFinder.LoadClass.INSTANCE;
+ //this.finder = ClassLoaderFinder.LoadClass.INSTANCE;
+ this.finder = CachingLoadClassClassLoaderFinder.INSTANCE;
return;
}
this.finder = finder;
Added: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/CachingLoadClassClassLoaderFinder.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/CachingLoadClassClassLoaderFinder.java (rev 0)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/CachingLoadClassClassLoaderFinder.java 2010-06-09 14:03:57 UTC (rev 105870)
@@ -0,0 +1,88 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.reflect.plugins.bytecode;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class CachingLoadClassClassLoaderFinder implements ClassLoaderFinder
+{
+ public static CachingLoadClassClassLoaderFinder INSTANCE = new CachingLoadClassClassLoaderFinder();
+
+ private final ConcurrentMap<ClassLoader, ConcurrentMap<String, ClassLoader>> loaders = new ConcurrentHashMap<ClassLoader, ConcurrentMap<String,ClassLoader>>(8, .75f, 2);
+
+ //private static final AtomicInteger HITS = new AtomicInteger();
+
+ //private static final AtomicInteger MISSES = new AtomicInteger();
+
+ private CachingLoadClassClassLoaderFinder()
+ {
+ }
+
+ public ClassLoader getLoaderForClass(ClassLoader initiating, String name)
+ {
+ ConcurrentMap<String, ClassLoader> loadersByClass = loaders.get(name);
+ if (loadersByClass == null)
+ {
+ loadersByClass = new ConcurrentHashMap<String, ClassLoader>(8, .75f, 2);
+ ConcurrentMap<String, ClassLoader> old = loaders.putIfAbsent(initiating, loadersByClass);
+ if (old != null)
+ loadersByClass = old;
+ }
+ ClassLoader loader = loadersByClass.get(name);
+ if (loader == null)
+ {
+ //MISSES.incrementAndGet();
+ try
+ {
+ Class<?> clazz = SecurityActions.loadClass(initiating, name);;
+ loader = SecurityActions.getClassLoader(clazz);
+ if (loader == null)
+ loader = SecurityActions.getSystemClassLoader();;
+ loadersByClass.putIfAbsent(name, loader);
+ }
+ catch (ClassNotFoundException e)
+ {
+ if (name.endsWith(".package-info"))
+ return null;
+ // AutoGenerated
+ throw new RuntimeException("Could not find '" + name + "' in classloader " + initiating);
+ }
+
+ }
+ else
+ {
+ //HITS.incrementAndGet();
+ int i = 0;
+ }
+
+ //System.out.println("====> " + name + " misses " + MISSES.get() + " hits " + HITS.get());
+ return loader;
+ }
+
+}
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/ClassLoaderFinder.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/ClassLoaderFinder.java 2010-06-09 13:55:31 UTC (rev 105869)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/ClassLoaderFinder.java 2010-06-09 14:03:57 UTC (rev 105870)
@@ -84,8 +84,9 @@
if (name.endsWith(".package-info"))
return null;
// AutoGenerated
- throw new RuntimeException(e);
+ throw new RuntimeException("Could not find '" + name + "' in classloader " + initiating);
}
}
}
+
}
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/bytes/asm/Util.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/bytes/asm/Util.java 2010-06-09 13:55:31 UTC (rev 105869)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/bytes/asm/Util.java 2010-06-09 14:03:57 UTC (rev 105870)
@@ -24,6 +24,7 @@
import java.lang.annotation.Annotation;
import java.lang.reflect.Array;
import java.util.ArrayList;
+import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -33,6 +34,7 @@
import org.jboss.reflect.util.objectweb.asm.AnnotationVisitor;
import org.jboss.reflect.util.objectweb.asm.Attribute;
import org.jboss.reflect.util.objectweb.asm.ClassVisitor;
+import org.jboss.reflect.util.objectweb.asm.ClassVisitorParts;
import org.jboss.reflect.util.objectweb.asm.FieldVisitor;
import org.jboss.reflect.util.objectweb.asm.Label;
import org.jboss.reflect.util.objectweb.asm.MethodVisitor;
@@ -204,6 +206,8 @@
{
Map<String, String> returnTypesByName = new HashMap<String, String>();
+ final static EnumSet<ClassVisitorParts> PARTS = EnumSet.noneOf(ClassVisitorParts.class);
+
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions)
{
@@ -213,6 +217,11 @@
}
return null;
}
+
+ public EnumSet<ClassVisitorParts> getParts()
+ {
+ return PARTS;
+ }
}
private static class DefaultAnnotationAttributeReader extends EmptyVisitor
@@ -222,6 +231,8 @@
final ClassLoader loader;
final AllAnnotationAttributesReader allAnnotationAttributesReader;
+ final static EnumSet<ClassVisitorParts> PARTS = EnumSet.noneOf(ClassVisitorParts.class);
+
public DefaultAnnotationAttributeReader(ClassLoader loader, AllAnnotationAttributesReader allAnnotationAttributesReader)
{
this.loader = loader;
@@ -233,7 +244,11 @@
{
return new AnnotationDefaultReader(name);
}
-
+
+ public EnumSet<ClassVisitorParts> getParts()
+ {
+ return PARTS;
+ }
// @Override
// public void visitEnd()
// {
@@ -360,7 +375,7 @@
}
- static class EmptyClassVisitor implements ClassVisitor
+ static abstract class EmptyClassVisitor implements ClassVisitor
{
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces)
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-06-09 13:55:31 UTC (rev 105869)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistMethodInfo.java 2010-06-09 14:03:57 UTC (rev 105870)
@@ -30,6 +30,7 @@
import javassist.bytecode.SignatureAttribute.MethodSignature;
import org.jboss.reflect.plugins.AnnotationHelper;
+import org.jboss.reflect.plugins.MethodInfoInternal;
import org.jboss.reflect.spi.ClassInfo;
import org.jboss.reflect.spi.MethodInfo;
import org.jboss.reflect.spi.MutableMethodInfo;
@@ -52,7 +53,7 @@
*/
// TODO: review hierarchy structure. Shouldn't JavassistMethodInfo extend MethodInfoImpl, just like
//ReflectMethodInfoImpl?
-public class JavassistMethodInfo extends JavassistAnnotatedParameterInfo implements MutableMethodInfo
+public class JavassistMethodInfo extends JavassistAnnotatedParameterInfo implements MutableMethodInfo, MethodInfoInternal
{
/** The serialVersionUID */
private static final long serialVersionUID = 101183748227690112L;
@@ -192,4 +193,9 @@
{
throw new RuntimeException("Method not supported by Javassist");
}
+
+ public int getNumberParameters()
+ {
+ return getSignatureKey().getParams().length;
+ }
}
More information about the jboss-cvs-commits
mailing list