diff options
-rw-r--r-- | gnu/java/lang/ClassHelper.java | 97 |
1 files changed, 91 insertions, 6 deletions
diff --git a/gnu/java/lang/ClassHelper.java b/gnu/java/lang/ClassHelper.java index d3c9500d1..8a564df5b 100644 --- a/gnu/java/lang/ClassHelper.java +++ b/gnu/java/lang/ClassHelper.java @@ -75,12 +75,16 @@ public class ClassHelper { v.addElement(currentMethods[i]); } for(int i=0;i<superMethods.length;i++) { + boolean addOK = true; for(int j=0;j<currentMethods.length;j++) { - if(!getTruncatedName(superMethods[i].getName()).equals(getTruncatedName(currentMethods[j].getName())) - || !ArrayHelper.equalsArray(superMethods[i].getParameterTypes(),currentMethods[j].getParameterTypes())) { - v.addElement(superMethods[i]); + if(getTruncatedName(superMethods[i].getName()).equals(getTruncatedName(currentMethods[j].getName())) + && ArrayHelper.equalsArray(superMethods[i].getParameterTypes(),currentMethods[j].getParameterTypes())) { + addOK = false; } } + if(addOK) { + v.addElement(superMethods[i]); + } } retval = new Method[v.size()]; @@ -109,12 +113,16 @@ public class ClassHelper { v.addElement(superMethods[i]); } for(int i=0;i<superMethods.length;i++) { + boolean addOK = true; for(int j=0;j<currentMethods.length;j++) { - if(!getTruncatedName(superMethods[i].getName()).equals(getTruncatedName(currentMethods[j].getName())) - || !ArrayHelper.equalsArray(superMethods[i].getParameterTypes(),currentMethods[j].getParameterTypes())) { - v.addElement(currentMethods[i]); + if(getTruncatedName(superMethods[i].getName()).equals(getTruncatedName(currentMethods[j].getName())) + && ArrayHelper.equalsArray(superMethods[i].getParameterTypes(),currentMethods[j].getParameterTypes())) { + addOK = false; } } + if(addOK) { + v.addElement(superMethods[i]); + } } retval = new Method[v.size()]; @@ -123,4 +131,81 @@ public class ClassHelper { } return retval; } + + static Hashtable allFields = new Hashtable(); + static Hashtable allFieldsAtDeclaration = new Hashtable(); + + /** Get all the fields, public, private and + ** otherwise, from the class, getting them + ** from the most recent class to find them. + **/ + public static Field[] getAllFields(Class clazz) { + Field[] retval = (Field[])allFields.get(clazz); + if(retval == null) { + Field[] superFields; + if(clazz.getSuperclass() != null) { + superFields = getAllFields(clazz.getSuperclass()); + } else { + superFields = new Field[0]; + } + Vector v = new Vector(); + Field[] currentFields = clazz.getDeclaredFields(); + for(int i=0;i<currentFields.length;i++) { + v.addElement(currentFields[i]); + } + for(int i=0;i<superFields.length;i++) { + boolean addOK = true; + for(int j=0;j<currentFields.length;j++) { + if(getTruncatedName(superFields[i].getName()).equals(getTruncatedName(currentFields[j].getName()))) { + addOK = false; + } + } + if(addOK) { + v.addElement(superFields[i]); + } + } + + retval = new Field[v.size()]; + v.copyInto(retval); + allFields.put(clazz,retval); + } + return retval; + } + + /** Get all the fields, public, private and + ** otherwise, from the class, and get them from + ** their point of declaration. + **/ + public static Field[] getAllFieldsAtDeclaration(Class clazz) { + Field[] retval = (Field[])allFieldsAtDeclaration.get(clazz); + if(retval == null) { + Field[] superFields; + if(clazz.getSuperclass() != null) { + superFields = getAllFieldsAtDeclaration(clazz.getSuperclass()); + } else { + superFields = new Field[0]; + } + Vector v = new Vector(); + Field[] currentFields = clazz.getDeclaredFields(); + for(int i=0;i<superFields.length;i++) { + v.addElement(superFields[i]); + } + for(int i=0;i<superFields.length;i++) { + boolean addOK = true; + for(int j=0;j<currentFields.length;j++) { + if(getTruncatedName(superFields[i].getName()).equals(getTruncatedName(currentFields[j].getName()))) { + addOK = false; + } + } + if(addOK) { + v.addElement(superFields[i]); + } + } + + retval = new Field[v.size()]; + v.copyInto(retval); + allFieldsAtDeclaration.put(clazz,retval); + } + return retval; + } } |