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

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Apr 29 11:09:58 EDT 2010


Author: kabir.khan at jboss.com
Date: 2010-04-29 11:09:58 -0400 (Thu, 29 Apr 2010)
New Revision: 104318

Removed:
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/ErrorCheckingMemberFactory.java
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/JavassistUtil.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
Log:
[JBREFLECT-6] Refactor a bit

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-04-29 14:54:09 UTC (rev 104317)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistReflectionFactory.java	2010-04-29 15:09:58 UTC (rev 104318)
@@ -45,10 +45,6 @@
  * the use of reflection. Although a lot faster, there is an overhead associated with generating
  * these classes, so they should only be used for frequently used members </p>
  * <p>
- * By default the generated classes class will not do any checking of the parameters. To turn this on,
- * specify <code>-Dorg.jboss.reflect.plugins.javassist.JavassistReflectionFactory.check=true</code>.
- * </p> 
- * <p>
  * To output the generated classes to disk, so the bytecode can be inspected, specify
  * <code>-Dorg.jboss.reflect.plugins.javassist.JavassistReflectionFactory.debug=true</code>.
  * </p>

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-04-29 14:54:09 UTC (rev 104317)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistUtil.java	2010-04-29 15:09:58 UTC (rev 104318)
@@ -21,11 +21,6 @@
  */
 package org.jboss.reflect.plugins.javassist;
 
-import org.jboss.reflect.spi.ClassInfo;
-import org.jboss.reflect.spi.TypeInfo;
-import org.jboss.util.Classes;
-import org.jboss.util.JBossStringBuilder;
-
 import java.lang.reflect.Array;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
@@ -40,8 +35,12 @@
 import javassist.CtMethod;
 import javassist.CtPrimitiveType;
 import javassist.NotFoundException;
-import javassist.bytecode.Descriptor;
 
+import org.jboss.reflect.spi.ClassInfo;
+import org.jboss.reflect.spi.TypeInfo;
+import org.jboss.util.Classes;
+import org.jboss.util.JBossStringBuilder;
+
 /**
  * A JavassistUtil.
  * 

Deleted: 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-04-29 14:54:09 UTC (rev 104317)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/ErrorCheckingMemberFactory.java	2010-04-29 15:09:58 UTC (rev 104318)
@@ -1,316 +0,0 @@
-/*
-* 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.javassist.bytecode;
-
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-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.JavassistField;
-import org.jboss.reflect.plugins.javassist.JavassistMethod;
-import org.jboss.reflect.plugins.javassist.JavassistUtil;
-import org.jboss.reflect.plugins.javassist.defaultmember.DefaultMemberFactory;
-import org.jboss.util.Strings;
-
-/**
- * JavassistMembers created using {@link JavassistMemberFactory} don't check the parameters
- * in the generated code. Do the same checks as ReflectionUtils here so we get the same behaviour
- * as when using the Introspection implementation or when the Javassist implementation uses the 
- * {@link DefaultMemberFactory}.
- * 
- * 
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision: 1.1 $
- */
-class ErrorCheckingMemberFactory 
-{
-   static JavassistMethod create(JavassistMethod m, CtMethod 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);
-      }
-      
-      return new ErrorCheckingJavassistMethod(m, method, numParameters);
-   }
-   
-   static JavassistConstructor create(JavassistConstructor c, CtConstructor 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);
-      }
-      
-      return new ErrorCheckingJavassistConstructor(c, constructor, numParameters);
-   }
-   
-   static JavassistField create(JavassistField f, CtField field)
-   {
-      if (f == null)
-         throw new IllegalArgumentException("Null field");
-      
-      return new ErrorCheckingJavassistField(f, field);
-   }
-   
-   private static boolean checkNumberOfParameters(Object[] args, int numParameters)
-   {
-      if (args == null && numParameters > 0)
-         return false;
-      if (args != null && args.length != numParameters)
-         return false;
-      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>();
-      if (args != null)
-      {
-         for (Object argument : args)
-         {
-            if (argument == null)
-               actual.add(null);
-            else
-               actual.add(argument.getClass().getName());
-         }
-      }
-      throw new IllegalArgumentException("Wrong arguments. " + context + " for target " + target + " expected=" + expected + " actual=" + actual);
-      
-   }
-
-   private static void handleWrongTarget(Object target, Class<?> expected, String name)
-   {
-      throw new IllegalArgumentException("Wrong target for " + name + " " + target.getClass().getName() + " is not a " + expected.getName());
-   }
-   
-   private static void handleNullTarget(AccessibleObject ao)
-   {
-      throw new IllegalArgumentException("Null target calling non-static " + ao);      
-   }
-   
-   private static class ErrorCheckingJavassistMethod implements JavassistMethod
-   {
-      private final JavassistMethod delegate;
-      private final CtMethod ctMethod;
-      private final int numParameters;
-      
-      private ErrorCheckingJavassistMethod(JavassistMethod delegate, CtMethod ctMethod, int numParameters)
-      {
-         this.delegate = delegate;
-         this.ctMethod = ctMethod;
-         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());
-         
-         try
-         {
-            return delegate.invoke(target, args);
-         }
-         catch(ClassCastException e)
-         {
-            Method method = JavassistUtil.ctMethodToMethod(ctMethod); 
-            if (!isStatic(ctMethod))
-            {
-               if (!method.getDeclaringClass().isAssignableFrom(target.getClass()))
-                  handleWrongTarget(target, method.getDeclaringClass(), method.getName());
-            }
-            
-            Class<?>[] params = method.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);
-            }
-            
-            throw e;
-         }
-         catch(NullPointerException e)
-         {
-            Method method = JavassistUtil.ctMethodToMethod(ctMethod); 
-            if (!isStatic(ctMethod) && target == null)
-               handleNullTarget(method);
-            
-            CtClass[] parameters = ctMethod.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);
-            }
-            
-            throw e;
-         }
-      }
-      
-   }
-
-   private static class ErrorCheckingJavassistConstructor implements JavassistConstructor
-   {
-      private final JavassistConstructor delegate;
-      private final CtConstructor ctConstructor;
-      private final int numParameters;
-      
-      private ErrorCheckingJavassistConstructor(JavassistConstructor delegate, CtConstructor ctConstructor, int numParameters)
-      {
-         this.delegate = delegate;
-         this.ctConstructor = ctConstructor;
-         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());
-         
-         try
-         {
-            return delegate.newInstance(args);
-         }
-         catch(ClassCastException e)
-         {
-            Constructor<?> constructor = JavassistUtil.ctConstructorToConstructor(ctConstructor);
-            Class<?>[] params = constructor.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);
-            }
-               
-            throw e;
-         }
-         catch(NullPointerException e)
-         {
-            CtClass[] parameters = ctConstructor.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);
-               }
-            }
-            
-            throw e;
-         }
-      }
-   }
-
-   private static class ErrorCheckingJavassistField implements JavassistField
-   {
-      private final JavassistField delegate;
-      private final CtField ctField;
-      
-      private ErrorCheckingJavassistField(JavassistField delegate, CtField ctField)
-      {
-         this.delegate = delegate;
-         this.ctField = ctField;
-      }
-
-      public Object get(Object target) throws Throwable
-      {
-         try
-         {
-            return delegate.get(target);
-         }
-         catch (ClassCastException e)
-         {
-            Field field = JavassistUtil.ctFieldToField(ctField);
-            
-            if (!isStatic(ctField) && !field.getDeclaringClass().isAssignableFrom(target.getClass()))
-               handleWrongTarget(target, field.getDeclaringClass(), field.getName());
-            
-            throw e;
-         }
-         catch(NullPointerException e)
-         {
-            Field field = JavassistUtil.ctFieldToField(ctField);
-            if (!isStatic(ctField) && target == null)
-               handleNullTarget(field);
-            throw e;
-         }
-      }
-
-      public void set(Object target, Object value) throws Throwable
-      {
-         try
-         {
-            delegate.set(target, value);
-         }
-         catch (ClassCastException e)
-         {
-            Field field = JavassistUtil.ctFieldToField(ctField);
-            Class<?> type = field.getType();
-
-            if (!isStatic(ctField) && !field.getDeclaringClass().isAssignableFrom(target.getClass()))
-               handleWrongTarget(target, field.getDeclaringClass(), field.getName());
-
-            if (!type.isAssignableFrom(value.getClass()))
-               throw new IllegalArgumentException("Wrong arguments. Setting " + field.getName() + " for target " + target + " expected=" + field.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);
-            throw e;
-         }
-      }
-   }
-}

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-04-29 14:54:09 UTC (rev 104317)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistConstructorFactory.java	2010-04-29 15:09:58 UTC (rev 104318)
@@ -45,7 +45,7 @@
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @version $Revision: 1.1 $
  */
-public class JavassistConstructorFactory extends JavassistBehaviorFactory
+class JavassistConstructorFactory extends JavassistBehaviorFactory
 {
    /** The names of the interfaces we are implementing */ 
    private static final String[] interfaceNames = new String[] {JavassistConstructor.class.getName()};

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-04-29 14:54:09 UTC (rev 104317)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistFieldFactory.java	2010-04-29 15:09:58 UTC (rev 104318)
@@ -47,7 +47,7 @@
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @version $Revision: 1.1 $
  */
-public class JavassistFieldFactory extends JavassistMemberFactory
+class JavassistFieldFactory extends JavassistMemberFactory
 {
    /** The names of the interfaces we are implementing */ 
    protected static final String[] interfaceNames;

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-04-29 14:54:09 UTC (rev 104317)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistMemberFactory.java	2010-04-29 15:09:58 UTC (rev 104318)
@@ -24,12 +24,17 @@
 import java.io.DataOutputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
+import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -37,6 +42,7 @@
 import javassist.CtClass;
 import javassist.CtConstructor;
 import javassist.CtField;
+import javassist.CtMember;
 import javassist.CtMethod;
 import javassist.Modifier;
 import javassist.NotFoundException;
@@ -57,6 +63,8 @@
 import org.jboss.reflect.plugins.javassist.JavassistConstructor;
 import org.jboss.reflect.plugins.javassist.JavassistField;
 import org.jboss.reflect.plugins.javassist.JavassistMethod;
+import org.jboss.reflect.plugins.javassist.JavassistUtil;
+import org.jboss.util.Strings;
 import org.jboss.util.UnreachableStatementException;
 
 /**
@@ -219,9 +227,7 @@
    {
       JavassistMemberFactory factory = new JavassistMethodFactory(superClass, ctMethod, debug);
       Class<JavassistMethod> member = factory.makeClass(JavassistMethod.class, ctMethod.getDeclaringClass());
-      JavassistMethod method = factory.instantiate(member);
-      method = ErrorCheckingMemberFactory.create(method, ctMethod);
-      return method;
+      return wrapInErrorChecker(factory.instantiate(member), ctMethod);
    }
 
    /**
@@ -237,9 +243,7 @@
    {
       JavassistMemberFactory factory = new JavassistConstructorFactory(superClass, ctConstructor, debug);
       Class<JavassistConstructor> member = factory.makeClass(JavassistConstructor.class, ctConstructor.getDeclaringClass());
-      JavassistConstructor constructor = factory.instantiate(member);
-      constructor = ErrorCheckingMemberFactory.create(constructor, ctConstructor);
-      return constructor;
+      return wrapInErrorChecker(factory.instantiate(member), ctConstructor);
    }
 
    /**
@@ -255,9 +259,7 @@
    {
       JavassistMemberFactory factory = new JavassistFieldFactory(superClass, ctField, debug);
       Class<JavassistField> member = factory.makeClass(JavassistField.class, ctField.getDeclaringClass());
-      JavassistField field = factory.instantiate(member);
-      field = ErrorCheckingMemberFactory.create(field, ctField);
-      return field;
+      return wrapInErrorChecker(factory.instantiate(member), ctField);
    }
 
    /**
@@ -745,6 +747,294 @@
       }
    }
 
+   /**
+    * Wraps the generated JavassistMethod in an implementation that checks the 
+    * parameters
+    * 
+    * @param m The wrapped method
+    * @param method the target method for information about the parameters
+    * @return the error checking wrapper 
+    */
+   private static JavassistMethod wrapInErrorChecker(JavassistMethod m, CtMethod 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);
+      }
+      
+      return new ErrorCheckingJavassistMethod(m, method, numParameters);
+   }
+   
+   /**
+    * Wraps the generated JavassistConstructor in an implementation that checks the 
+    * parameters
+    * 
+    * @param c The wrapped constructor
+    * @param constructor the target constructor for information about the parameters
+    * @return the error checking wrapper 
+    */
+   private static JavassistConstructor wrapInErrorChecker(JavassistConstructor c, CtConstructor 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);
+      }
+      
+      return new ErrorCheckingJavassistConstructor(c, constructor, numParameters);
+   }
+   
+   /**
+    * Wraps the generated JavassistField in an implementation that checks the 
+    * parameters
+    * 
+    * @param f The wrapped field
+    * @param field the target field for information about the parameters
+    * @return the error checking wrapper 
+    */
+   private static JavassistField wrapInErrorChecker(JavassistField f, CtField field)
+   {
+      if (f == null)
+         throw new IllegalArgumentException("Null field");
+      
+      return new ErrorCheckingJavassistField(f, field);
+   }
+   
+   private static class ErrorChecker
+   {
+      protected boolean checkNumberOfParameters(Object[] args, int numParameters)
+      {
+         if (args == null && numParameters > 0)
+            return false;
+         if (args != null && args.length != numParameters)
+            return false;
+         return true;
+      }
+      
+      protected boolean isStatic(CtMember member)
+      {
+         return Modifier.isStatic(member.getModifiers());
+      }
+      
+      protected void handleWrongParameters(String context, String target, Class<?>[] expected, Object[] args)
+      {
+         List<String> actual = new ArrayList<String>();
+         if (args != null)
+         {
+            for (Object argument : args)
+            {
+               if (argument == null)
+                  actual.add(null);
+               else
+                  actual.add(argument.getClass().getName());
+            }
+         }
+         throw new IllegalArgumentException("Wrong arguments. " + context + " for target " + target + " expected=" + expected + " actual=" + actual);
+         
+      }
+
+      protected void handleWrongTarget(Object target, Class<?> expected, String name)
+      {
+         throw new IllegalArgumentException("Wrong target for " + name + " " + target.getClass().getName() + " is not a " + expected.getName());
+      }
+      
+      protected void handleNullTarget(AccessibleObject ao)
+      {
+         throw new IllegalArgumentException("Null target calling non-static " + ao);      
+      }
+      
+   }
+   
+   private static class ErrorCheckingJavassistMethod extends ErrorChecker implements JavassistMethod
+   {
+      private final JavassistMethod delegate;
+      private final CtMethod ctMethod;
+      private final int numParameters;
+      
+      private ErrorCheckingJavassistMethod(JavassistMethod delegate, CtMethod ctMethod, int numParameters)
+      {
+         this.delegate = delegate;
+         this.ctMethod = ctMethod;
+         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());
+         
+         try
+         {
+            return delegate.invoke(target, args);
+         }
+         catch(ClassCastException e)
+         {
+            Method method = JavassistUtil.ctMethodToMethod(ctMethod); 
+            if (!isStatic(ctMethod))
+            {
+               if (!method.getDeclaringClass().isAssignableFrom(target.getClass()))
+                  handleWrongTarget(target, method.getDeclaringClass(), method.getName());
+            }
+            
+            Class<?>[] params = method.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);
+            }
+            
+            throw e;
+         }
+         catch(NullPointerException e)
+         {
+            Method method = JavassistUtil.ctMethodToMethod(ctMethod); 
+            if (!isStatic(ctMethod) && target == null)
+               handleNullTarget(method);
+            
+            CtClass[] parameters = ctMethod.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);
+            }
+            
+            throw e;
+         }
+      }
+      
+   }
+
+   private static class ErrorCheckingJavassistConstructor extends ErrorChecker implements JavassistConstructor
+   {
+      private final JavassistConstructor delegate;
+      private final CtConstructor ctConstructor;
+      private final int numParameters;
+      
+      private ErrorCheckingJavassistConstructor(JavassistConstructor delegate, CtConstructor ctConstructor, int numParameters)
+      {
+         this.delegate = delegate;
+         this.ctConstructor = ctConstructor;
+         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());
+         
+         try
+         {
+            return delegate.newInstance(args);
+         }
+         catch(ClassCastException e)
+         {
+            Constructor<?> constructor = JavassistUtil.ctConstructorToConstructor(ctConstructor);
+            Class<?>[] params = constructor.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);
+            }
+               
+            throw e;
+         }
+         catch(NullPointerException e)
+         {
+            CtClass[] parameters = ctConstructor.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);
+               }
+            }
+            
+            throw e;
+         }
+      }
+   }
+
+   private static class ErrorCheckingJavassistField extends ErrorChecker implements JavassistField
+   {
+      private final JavassistField delegate;
+      private final CtField ctField;
+      
+      private ErrorCheckingJavassistField(JavassistField delegate, CtField ctField)
+      {
+         this.delegate = delegate;
+         this.ctField = ctField;
+      }
+
+      public Object get(Object target) throws Throwable
+      {
+         try
+         {
+            return delegate.get(target);
+         }
+         catch (ClassCastException e)
+         {
+            Field field = JavassistUtil.ctFieldToField(ctField);
+            
+            if (!isStatic(ctField) && !field.getDeclaringClass().isAssignableFrom(target.getClass()))
+               handleWrongTarget(target, field.getDeclaringClass(), field.getName());
+            
+            throw e;
+         }
+         catch(NullPointerException e)
+         {
+            Field field = JavassistUtil.ctFieldToField(ctField);
+            if (!isStatic(ctField) && target == null)
+               handleNullTarget(field);
+            throw e;
+         }
+      }
+
+      public void set(Object target, Object value) throws Throwable
+      {
+         try
+         {
+            delegate.set(target, value);
+         }
+         catch (ClassCastException e)
+         {
+            Field field = JavassistUtil.ctFieldToField(ctField);
+            Class<?> type = field.getType();
+
+            if (!isStatic(ctField) && !field.getDeclaringClass().isAssignableFrom(target.getClass()))
+               handleWrongTarget(target, field.getDeclaringClass(), field.getName());
+
+            if (!type.isAssignableFrom(value.getClass()))
+               throw new IllegalArgumentException("Wrong arguments. Setting " + field.getName() + " for target " + target + " expected=" + field.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);
+            throw e;
+         }
+      }
+   }
+   
+   
    private static class ParentLoaderHandler
    {
       final ClassLoader reflectLoader;

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-04-29 14:54:09 UTC (rev 104317)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/bytecode/JavassistMethodFactory.java	2010-04-29 15:09:58 UTC (rev 104318)
@@ -47,7 +47,7 @@
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @version $Revision: 1.1 $
  */
-public class JavassistMethodFactory extends JavassistBehaviorFactory
+class JavassistMethodFactory extends JavassistBehaviorFactory
 {
    /** The names of the interfaces we are implementing */ 
    private static final String[] interfaceNames;




More information about the jboss-cvs-commits mailing list