private Method[] internalGetMethods() { java.util.HashMap map = new java.util.HashMap(); Method[] methods; Class[] interfaces = getInterfaces(); for(int i = 0; i < interfaces.length; i++) { methods = interfaces[i].internalGetMethods(); for(int j = 0; j < methods.length; j++) { map.put(new MethodKey(methods[j]), methods[j]); } } Class superClass = getSuperclass(); if(superClass != null) { methods = superclass.internalGetMethods(); for(int i = 0; i < methods.length; i++) { map.put(new MethodKey(methods[i]), methods[i]); } } methods = getDeclaredMethods(true); for(int i = 0; i < methods.length; i++) { map.put(new MethodKey(methods[i]), methods[i]); } return (Method[])map.values().toArray(new Method[map.size()]); } private static final class MethodKey { private String name; private Class[] params; private Class returnType; private int hash; MethodKey(Method m) { name = m.getName(); params = m.getParameterTypes(); returnType = m.getReturnType(); hash = name.hashCode() ^ returnType.hashCode(); for(int i = 0; i < params.length; i++) { hash ^= params[i].hashCode(); } } public boolean equals(Object o) { if(o instanceof MethodKey) { MethodKey m = (MethodKey)o; if(m.name.equals(name) && m.params.length == params.length && m.returnType == returnType) { for(int i = 0; i < params.length; i++) { if(m.params[i] != params[i]) { return false; } } return true; } } return false; } public int hashCode() { return hash; } }