[jboss-cvs] JBossAS SVN: r80194 - in projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors: lang and 1 other directory.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Wed Oct 29 10:36:15 EDT 2008
Author: wolfc
Date: 2008-10-29 10:36:14 -0400 (Wed, 29 Oct 2008)
New Revision: 80194
Modified:
projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/direct/AbstractDirectContainer.java
projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/lang/ClassHelper.java
Log:
EJBTHREE-1556: find a correct declared method taking the parameters into account
Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/direct/AbstractDirectContainer.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/direct/AbstractDirectContainer.java 2008-10-29 13:30:04 UTC (rev 80193)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/direct/AbstractDirectContainer.java 2008-10-29 14:36:14 UTC (rev 80194)
@@ -126,7 +126,16 @@
@SuppressWarnings("unchecked")
public <R> R invoke(BeanContext<T> target, String methodName, Object ... args) throws Throwable
{
- Method method = ClassHelper.getMethod(target.getInstance().getClass(), methodName);
+ Method method;
+ if(args != null)
+ {
+ Class<?> params[] = new Class<?>[args.length];
+ for(int i = 0; i < params.length; i++)
+ params[i] = args[i].getClass();
+ method = ClassHelper.getMethod(target.getInstance().getClass(), methodName, params);
+ }
+ else
+ method = ClassHelper.getMethod(target.getInstance().getClass(), methodName);
return (R) invoke(target, method, args);
}
Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/lang/ClassHelper.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/lang/ClassHelper.java 2008-10-29 13:30:04 UTC (rev 80193)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/lang/ClassHelper.java 2008-10-29 14:36:14 UTC (rev 80194)
@@ -24,6 +24,7 @@
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -36,6 +37,40 @@
*/
public class ClassHelper
{
+ private static Map<Class<?>, Class<?>> primitiveWrapperMap = new HashMap<Class<?>, Class<?>>();
+ static
+ {
+ primitiveWrapperMap.put(Boolean.TYPE, Boolean.class);
+ primitiveWrapperMap.put(Byte.TYPE, Byte.class);
+ primitiveWrapperMap.put(Character.TYPE, Character.class);
+ primitiveWrapperMap.put(Short.TYPE, Short.class);
+ primitiveWrapperMap.put(Integer.TYPE, Integer.class);
+ primitiveWrapperMap.put(Long.TYPE, Long.class);
+ primitiveWrapperMap.put(Double.TYPE, Double.class);
+ primitiveWrapperMap.put(Float.TYPE, Float.class);
+ primitiveWrapperMap.put(Void.TYPE, Void.TYPE);
+ }
+
+ private static boolean checkParameters(Class<?> parameterTypes[], Class<?> methodParameterTypes[])
+ {
+ if(parameterTypes.length != methodParameterTypes.length)
+ return false;
+ for(int i = 0; i < parameterTypes.length; i++)
+ {
+ Class<?> methodParameterType = methodParameterTypes[i];
+ if(methodParameterType.isPrimitive())
+ methodParameterType = primitiveWrapperMap.get(methodParameterType);
+ Class<?> parameterType = parameterTypes[i];
+ if(parameterType.isPrimitive())
+ parameterType = primitiveWrapperMap.get(parameterType);
+ if(!methodParameterType.isAssignableFrom(parameterType))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
/**
* Returns all public, private and package protected methods including
* inherited ones.
@@ -101,13 +136,27 @@
Method m = getDeclaredMethod(cls, methodName, params);
if (m == null)
{
- throw new NoSuchMethodException("No method named " + methodName + " in " + cls + " (or super classes)");
+ throw new NoSuchMethodException("No method named " + methodName + "(" + (params != null ? Arrays.toString(params) : "") + ") in " + cls + " (or super classes)");
}
return m;
}
private static Method getDeclaredMethod(Class<?> cls, String methodName, Class<?> ... params)
{
+ Method methods[] = cls.getDeclaredMethods();
+ for(Method method : methods)
+ {
+ if(method.getName().equals(methodName))
+ {
+ if(params == null)
+ return method;
+ Class<?> methodParameterTypes[] = method.getParameterTypes();
+ if(params.length != methodParameterTypes.length)
+ continue;
+ if(checkParameters(params, methodParameterTypes))
+ return method;
+ }
+ }
try
{
return cls.getDeclaredMethod(methodName, params);
More information about the jboss-cvs-commits
mailing list