Author: niallp
Date: Sun Jan 9 20:04:16 2011
New Revision: 1057013
URL: http://svn.apache.org/viewvc?rev=1057013&view=rev
Log:
Port BEANUTILS-381 to LANG 2.x Branch - getMatchingAccessibleMethod does not
correctly handle inheritance and method overloading - thanks to Todd Nine for
the patch
Modified:
commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/reflect/MemberUtils.java
commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/reflect/MethodUtilsTest.java
Modified:
commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/reflect/MemberUtils.java
URL:
http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/reflect/MemberUtils.java?rev=1057013&r1=1057012&r2=1057013&view=diff
==============================================================================
---
commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/reflect/MemberUtils.java
(original)
+++
commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/reflect/MemberUtils.java
Sun Jan 9 20:04:16 2011
@@ -168,7 +168,7 @@ abstract class MemberUtils {
return getPrimitivePromotionCost(srcClass, destClass);
}
float cost = 0.0f;
- while (destClass != null && !destClass.equals(srcClass)) {
+ while (srcClass != null && !destClass.equals(srcClass)) {
if (destClass.isInterface() && ClassUtils.isAssignable(srcClass,
destClass)) {
// slight penalty for interface match.
// we still want an exact match to override an interface match,
@@ -179,13 +179,13 @@ abstract class MemberUtils {
break;
}
cost++;
- destClass = destClass.getSuperclass();
+ srcClass = srcClass.getSuperclass();
}
/*
* If the destination class is null, we've travelled all the way up to
* an Object match. We'll penalize this by adding 1.5 to the cost.
*/
- if (destClass == null) {
+ if (srcClass == null) {
cost += 1.5f;
}
return cost;
Modified:
commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/reflect/MethodUtilsTest.java
URL:
http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/reflect/MethodUtilsTest.java?rev=1057013&r1=1057012&r2=1057013&view=diff
==============================================================================
---
commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/reflect/MethodUtilsTest.java
(original)
+++
commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/reflect/MethodUtilsTest.java
Sun Jan 9 20:04:16 2011
@@ -296,6 +296,16 @@ public class MethodUtilsTest extends Tes
singletonArray(Double.class), singletonArray(Double.TYPE));
expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
singletonArray(Double.TYPE), singletonArray(Double.TYPE));
+ expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
+ singletonArray(Double.TYPE), singletonArray(Double.TYPE));
+ expectMatchingAccessibleMethodParameterTypes(InheritanceBean.class,
"testOne",
+ singletonArray(ParentObject.class),
singletonArray(ParentObject.class));
+ expectMatchingAccessibleMethodParameterTypes(InheritanceBean.class,
"testOne",
+ singletonArray(ChildObject.class),
singletonArray(ParentObject.class));
+ expectMatchingAccessibleMethodParameterTypes(InheritanceBean.class,
"testTwo",
+ singletonArray(ParentObject.class),
singletonArray(GrandParentObject.class));
+ expectMatchingAccessibleMethodParameterTypes(InheritanceBean.class,
"testTwo",
+ singletonArray(ChildObject.class),
singletonArray(ChildInterface.class));
}
private void expectMatchingAccessibleMethodParameterTypes(Class cls,
@@ -320,4 +330,17 @@ public class MethodUtilsTest extends Tes
return result;
}
+ public static class InheritanceBean {
+ public void testOne(Object obj) {}
+ public void testOne(GrandParentObject obj) {}
+ public void testOne(ParentObject obj) {}
+ public void testTwo(Object obj) {}
+ public void testTwo(GrandParentObject obj) {}
+ public void testTwo(ChildInterface obj) {}
+ }
+ interface ChildInterface {}
+ public static class GrandParentObject {}
+ public static class ParentObject extends GrandParentObject {}
+ public static class ChildObject extends ParentObject implements
ChildInterface {}
+
}