[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