diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-10-22 12:14:16 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-10-22 12:14:16 +0000 |
commit | a90826fc6f3cba8f4541a2a4e02739de6e7954a1 (patch) | |
tree | 2c1e2d5c0504e3082592a61697d267a4e60d4d6d | |
parent | 6bd66ef67649eecd6012ce10f3da39c325ea4675 (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.java | 20 |
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)); } |