package ch14reflect; import java.io.Serializable; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; import static net.mindview.util.Print.print; import static net.mindview.util.Print.printnb; public class ReflectDemo { /** * @param t * @param <T> */ public <T> void showMethods(T t) { Class<?> c = t.getClass(); Method[] methods = c.getMethods(); Constructor[] constructors = c.getConstructors(); for (Method m : methods) { printnb(m.toString()); print(); } for (Constructor constructor : constructors) { printnb(constructor.toGenericString()); print(); } } public <T> void showFields(T t) throws Exception { Class<?> c = t.getClass(); Field[] fields = c.getDeclaredFields(); System.out.println(fields.length); List<Class> ccc = new ArrayList<Class>(); ccc.add(Integer.TYPE); ccc.add(Boolean.TYPE); ccc.add(Byte.TYPE); ccc.add(Short.TYPE); ccc.add(Float.TYPE); ccc.add(Double.TYPE); ccc.add(Character.TYPE); ccc.add(Long.TYPE); ccc.add(String.class); ccc.add(Integer.class); ccc.add(Boolean.class); ccc.add(Byte.class); ccc.add(Short.class); ccc.add(Float.class); ccc.add(Double.class); ccc.add(Character.class); ccc.add(Long.class); ccc.add(java.security.ProtectionDomain.class); ccc.add(sun.reflect.ReflectionFactory.class); ccc.add(sun.reflect.annotation.AnnotationType.class); ccc.add(sun.util.calendar.BaseCalendar.class); for (Field f : fields) { if (Modifier.isTransient(f.getModifiers())) { continue; } if (f.getType().isInterface()) { continue; } Class clazz = f.getType(); if (ccc.contains(clazz)) { continue; } if (!Serializable.class.isAssignableFrom(f.getType())) { System.out.println("error !!! "); System.out.println(f.getType().getName() + " : " + f.getName()); System.exit(1); } if (f.getType().getDeclaredFields().length > 0) { showFields(f.getType()); } } } }