| /* gnu.java.lang.ClassHelper |
| Copyright (C) 1998 Free Software Foundation, Inc. |
| |
| This file is part of GNU Classpath. |
| |
| GNU Classpath is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2, or (at your option) |
| any later version. |
| |
| GNU Classpath is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with GNU Classpath; see the file COPYING. If not, write to the |
| Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA |
| 02111-1307 USA. |
| |
| As a special exception, if you link this library with other files to |
| produce an executable, this library does not by itself cause the |
| resulting executable to be covered by the GNU General Public License. |
| This exception does not however invalidate any other reasons why the |
| executable file might be covered by the GNU General Public License. */ |
| |
| |
| package gnu.java.lang; |
| |
| import java.util.*; |
| import java.lang.reflect.*; |
| |
| /** |
| ** ClassHelper has various methods that ought to have been |
| ** in class. |
| ** |
| ** @author John Keiser |
| ** @version 1.1.0, 29 Jul 1998 |
| **/ |
| |
| public class ClassHelper { |
| /** Strip the package part from the class name. |
| ** @param clazz the class to get the truncated name from |
| ** @return the truncated class name. |
| **/ |
| public static String getTruncatedClassName(Class clazz) { |
| return getTruncatedName(clazz.getName()); |
| } |
| /** Strip the package part from the class name, or the |
| ** class part from the method or field name. |
| ** @param name the name to truncate. |
| ** @return the truncated name. |
| **/ |
| public static String getTruncatedName(String name) { |
| int lastInd = name.lastIndexOf('.'); |
| if(lastInd == -1) { |
| return name; |
| } else { |
| return name.substring(lastInd+1); |
| } |
| } |
| |
| /** Strip the last portion of the name (after the last |
| ** dot). |
| ** @param name the name to get package of. |
| ** @return the package name. "" if no package. |
| **/ |
| public static String getPackagePortion(String name) { |
| int lastInd = name.lastIndexOf('.'); |
| if(lastInd == -1) { |
| return ""; |
| } else { |
| return name.substring(0,lastInd); |
| } |
| } |
| |
| static Hashtable allMethods = new Hashtable(); |
| static Hashtable allMethodsAtDeclaration = new Hashtable(); |
| |
| /** Get all the methods, public, private and |
| ** otherwise, from the class, getting them |
| ** from the most recent class to find them. |
| **/ |
| public static Method[] getAllMethods(Class clazz) { |
| Method[] retval = (Method[])allMethods.get(clazz); |
| if(retval == null) { |
| Method[] superMethods; |
| if(clazz.getSuperclass() != null) { |
| superMethods = getAllMethods(clazz.getSuperclass()); |
| } else { |
| superMethods = new Method[0]; |
| } |
| Vector v = new Vector(); |
| Method[] currentMethods = clazz.getDeclaredMethods(); |
| for(int i=0;i<currentMethods.length;i++) { |
| 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())) { |
| addOK = false; |
| } |
| } |
| if(addOK) { |
| v.addElement(superMethods[i]); |
| } |
| } |
| |
| retval = new Method[v.size()]; |
| v.copyInto(retval); |
| allMethods.put(clazz,retval); |
| } |
| return retval; |
| } |
| |
| /** Get all the methods, public, private and |
| ** otherwise, from the class, and get them from |
| ** their point of declaration. |
| **/ |
| public static Method[] getAllMethodsAtDeclaration(Class clazz) { |
| Method[] retval = (Method[])allMethodsAtDeclaration.get(clazz); |
| if(retval == null) { |
| Method[] superMethods; |
| if(clazz.getSuperclass() != null) { |
| superMethods = getAllMethodsAtDeclaration(clazz.getSuperclass()); |
| } else { |
| superMethods = new Method[0]; |
| } |
| Vector v = new Vector(); |
| Method[] currentMethods = clazz.getDeclaredMethods(); |
| for(int i=0;i<superMethods.length;i++) { |
| 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())) { |
| addOK = false; |
| } |
| } |
| if(addOK) { |
| v.addElement(superMethods[i]); |
| } |
| } |
| |
| retval = new Method[v.size()]; |
| v.copyInto(retval); |
| allMethodsAtDeclaration.put(clazz,retval); |
| } |
| 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; |
| } |
| } |