summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-12-28 18:12:00 +0000
committerRich Hickey <richhickey@gmail.com>2007-12-28 18:12:00 +0000
commit7ceb044e9ee962c4fd5f86a9152a4ed703ef5c80 (patch)
tree8f926f78aaf5493c17403923e8accaafc374df6e /src
parent7c2ef5d06bde5b0475e4523b7b4d47ed4bcfe52e (diff)
fixed search for method in public base
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/Reflector.java65
1 files changed, 31 insertions, 34 deletions
diff --git a/src/jvm/clojure/lang/Reflector.java b/src/jvm/clojure/lang/Reflector.java
index 74a80ccb..3c3239ab 100644
--- a/src/jvm/clojure/lang/Reflector.java
+++ b/src/jvm/clojure/lang/Reflector.java
@@ -23,16 +23,16 @@ public class Reflector{
public static Object invokeInstanceMethod(Object target, String methodName, Object[] args) throws Exception{
Class c = target.getClass();
List methods = getMethods(c, args.length, methodName, false);
- return prepRet(invokeMatchingMethod(methods, target, args));
+ return prepRet(invokeMatchingMethod(methodName, methods, target, args));
}
-private static Object invokeMatchingMethod(List methods, Object target, Object[] args)
+private static Object invokeMatchingMethod(String methodName, List methods, Object target, Object[] args)
throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
Method m = null;
Object[] boxedArgs = null;
if(methods.isEmpty())
{
- throw new IllegalArgumentException("No matching field or method found");
+ throw new IllegalArgumentException("No matching method found: " + methodName);
}
else if(methods.size() == 1)
{
@@ -56,46 +56,43 @@ private static Object invokeMatchingMethod(List methods, Object target, Object[]
}
}
if(m == null)
- throw new IllegalArgumentException("No matching field or method found");
+ throw new IllegalArgumentException("No matching method found: " + methodName);
if(!Modifier.isPublic(m.getDeclaringClass().getModifiers()))
{
- //public method of non-public class, try to find it in an interface
- Class c = m.getDeclaringClass();
- for(Class iface : c.getInterfaces())
+ //public method of non-public class, try to find it in hierarchy
+ m = getAsMethodOfPublicBase(m.getDeclaringClass(), m);
+ }
+ if(m == null)
+ throw new IllegalArgumentException("No matching method found: " + methodName);
+ return prepRet(m.invoke(target, boxedArgs));
+}
+
+public static Method getAsMethodOfPublicBase(Class c, Method m){
+ for(Class iface : c.getInterfaces())
+ {
+ for(Method im : iface.getMethods())
{
- for(Method im : iface.getDeclaredMethods())
+ if(im.getName().equals(m.getName())
+ && Arrays.equals(m.getParameterTypes(), im.getParameterTypes()))
{
- if(im.getName().equals(m.getName())
- && Arrays.equals(m.getParameterTypes(), im.getParameterTypes()))
- {
- m = im;
- break;
- }
+ return im;
}
}
- //still haven't found a public version, try superclasses
- if(!Modifier.isPublic(m.getDeclaringClass().getModifiers()))
+ }
+ Class sc = c.getSuperclass();
+ if(sc == null)
+ return null;
+ for(Method scm : sc.getMethods())
+ {
+ if(scm.getName().equals(m.getName())
+ && Arrays.equals(m.getParameterTypes(), scm.getParameterTypes())
+ && Modifier.isPublic(scm.getDeclaringClass().getModifiers()))
{
- sc:
- for(Class sc = c.getSuperclass(); sc != null; sc = sc.getSuperclass())
- {
- if(Modifier.isPublic(sc.getModifiers()))
- {
- for(Method scm : sc.getDeclaredMethods())
- {
- if(scm.getName().equals(m.getName())
- && Arrays.equals(m.getParameterTypes(), scm.getParameterTypes()))
- {
- m = scm;
- break sc;
- }
- }
- }
- }
+ return scm;
}
}
- return prepRet(m.invoke(target, boxedArgs));
+ return getAsMethodOfPublicBase(sc, m);
}
public static Object invokeConstructor(Class c, Object[] args) throws Exception{
@@ -142,7 +139,7 @@ public static Object invokeStaticMethod(String className, String methodName, Obj
if(methodName.equals("new"))
return invokeConstructor(c, args);
List methods = getMethods(c, args.length, methodName, true);
- return invokeMatchingMethod(methods, null, args);
+ return invokeMatchingMethod(methodName, methods, null, args);
}
public static Object getStaticField(String className, String fieldName) throws Exception{