package greencode.util; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; public final class ClassUtils { private ClassUtils() {} private static final HashMap<Class<?>, Class<?>[]> cachedClass = new HashMap<Class<?>, Class<?>[]>(); private static final HashMap<Class<?>, HashMap<Class<?>, Class<?>[]>> cachedClassWithDelimiter = new HashMap<Class<?>, HashMap<Class<?>, Class<?>[]>>(); private static final HashMap<Class<?>, HashSet<Class<?>>> parentsClass = new HashMap<Class<?>, HashSet<Class<?>>>(); private static final HashSet<Class<?>> wrapperTypes = new HashSet<Class<?>>(); private static final HashSet<Class<?>> primitivesTypes = new HashSet<Class<?>>(); static{ wrapperTypes.add(String.class); wrapperTypes.add(Boolean.class); wrapperTypes.add(Character.class); wrapperTypes.add(Byte.class); wrapperTypes.add(Short.class); wrapperTypes.add(Integer.class); wrapperTypes.add(Long.class); wrapperTypes.add(Float.class); wrapperTypes.add(Double.class); wrapperTypes.add(Void.class); primitivesTypes.add(boolean.class); primitivesTypes.add(char.class); primitivesTypes.add(byte.class); primitivesTypes.add(short.class); primitivesTypes.add(int.class); primitivesTypes.add(long.class); primitivesTypes.add(float.class); primitivesTypes.add(double.class); primitivesTypes.add(void.class); } public final static Class<?> toWrapperClass(Class<?> c) { if(c.equals(boolean.class)) return Boolean.class; if(c.equals(char.class)) return Character.class; if(c.equals(byte.class)) return Byte.class; if(c.equals(short.class)) return Short.class; if(c.equals(int.class)) return Integer.class; if(c.equals(long.class)) return Long.class; if(c.equals(float.class)) return Float.class; if(c.equals(double.class)) return Double.class; if(c.equals(void.class)) return Void.class; return c; } public final static boolean isPrimitiveOrWrapper(Class<?> c) { return primitivesTypes.contains(c) || wrapperTypes.contains(c); } public final static boolean isWrapperType(Class<?> c) { return wrapperTypes.contains(c); } public final static boolean isPrimitiveType(Class<?> c) { return primitivesTypes.contains(c); } public final static Object getDefaultValue(Class<?> c) { if(c.equals(byte.class) || c.equals(short.class) || c.equals(int.class)) return 0; if(c.equals(long.class)) return 0L; if(c.equals(float.class)) return 0.0f; if(c.equals(double.class)) return 0.0d; if(c.equals(char.class)) return '\u0000'; if(c.equals(boolean.class)) return false; return null; } public final static boolean isParent(Class<?> clazz, Class<?> parentClass) { if(clazz.isArray()) clazz = clazz.getComponentType(); HashSet<Class<?>> parents = parentsClass.get(clazz); if(parents == null) { parentsClass.put(clazz, parents = new HashSet<Class<?>>()); boolean isParent = false; Class<?> parent = clazz; while((parent = parent.getSuperclass()) != Object.class && parent != null) { if(!isParent && parent.equals(parentClass)) isParent = true; parents.add(parent); } return isParent; } return parents.contains(parentClass); } public static Class<?>[] getParents(final Class<?> Class) { return getParents(Class, null); } public static Class<?>[] getParents(final Class<?> Class, Class<?> delimiter) { return getParents(Class, delimiter, null); } public static<E> Class<E>[] getParents(final Class<?> clazz, Class<?> delimiter, Class<E> cast) { HashMap<Class<?>, Class<?>[]> classHash; final Class<?> index; if(delimiter != null) { if((classHash = cachedClassWithDelimiter.get(clazz)) == null) cachedClassWithDelimiter.put(clazz, classHash = new HashMap<Class<?>, Class<?>[]>()); index = delimiter; }else { classHash = cachedClass; delimiter = Object.class; index = clazz; } Class<?>[] classes; if((classes = classHash.get(index)) == null) { final List<Class<?>> _classes = new ArrayList<Class<?>>(); Class<?> parent = clazz; while((parent = parent.getSuperclass()) != delimiter && parent != null) _classes.add(parent); classes = _classes.toArray(new Class<?>[_classes.size()]); classHash.put(index, classes); } return (Class<E>[]) classes; } }