summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-10-22 12:14:16 +0000
committerRich Hickey <richhickey@gmail.com>2007-10-22 12:14:16 +0000
commita90826fc6f3cba8f4541a2a4e02739de6e7954a1 (patch)
tree2c1e2d5c0504e3082592a61697d267a4e60d4d6d
parent6bd66ef67649eecd6012ce10f3da39c325ea4675 (diff)
added handling of public methods of non-public classes with call via interface method, or failing that, public superclass method
-rw-r--r--src/jvm/clojure/lang/Reflector.java20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/jvm/clojure/lang/Reflector.java b/src/jvm/clojure/lang/Reflector.java
index 3b95acd9..fb8e9b1b 100644
--- a/src/jvm/clojure/lang/Reflector.java
+++ b/src/jvm/clojure/lang/Reflector.java
@@ -72,6 +72,26 @@ private static Object invokeMatchingMethod(List methods, Object target, Object[]
}
}
}
+ //still haven't found a public version, try superclasses
+ if(!Modifier.isPublic(m.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 prepRet(m.invoke(target, boxedArgs));
}