1 package jfun.yan.util; 2 3 import java.lang.reflect.Constructor ; 4 import java.lang.reflect.Field ; 5 import java.lang.reflect.Method ; 6 import java.util.HashSet ; 7 import java.util.Set ; 8 import java.util.WeakHashMap ; 9 10 21 public class Introspector { 22 private final WeakHashMap <Class ,ClassDescriptor> cache 23 = new WeakHashMap <Class ,ClassDescriptor>(); 24 private interface Sink{ 25 void addMethod(Method mtd); 26 void addField(Field fld); 27 void addConstructor(Constructor ctor); 28 } 29 34 public synchronized <T> ClassDescriptor<T> getClassDescriptor(Class <T> type){ 35 ClassDescriptor<T> ret = (ClassDescriptor<T>)cache.get(type); 36 if(ret!=null) return ret; 37 ret = describeClass(type); 38 cache.put(type, ret); 39 return ret; 40 } 41 private void populateParent(ClassDescriptor desc, Class type, Set visited){ 42 if(visited.contains(type)) 43 return; 44 final ClassDescriptor parent = getClassDescriptor(type); 45 desc.addAll(parent); 46 visited.add(type); 47 } 48 private Class getSuperclass(Class type){ 49 if(type.isInterface()){ 50 return Object .class; 51 } 52 else return type.getSuperclass(); 53 } 54 private <T> ClassDescriptor<T> describeClass(Class <T> type){ 55 final ClassDescriptor<T> desc = new ClassDescriptor<T>(type); 56 final Class [] itfs = type.getInterfaces(); 57 final HashSet visited = new HashSet (); 58 if(itfs!=null){ 59 for(int i=0; i<itfs.length; i++){ 60 populateParent(desc, itfs[i], visited); 61 } 62 } 63 final Class parent = getSuperclass(type); 64 if(parent!=null && !parent.equals(type)){ 65 populateParent(desc, parent, visited); 66 } 67 final Field [] flds = type.getDeclaredFields(); 68 for(int i=0; i<flds.length; i++){ 69 desc.addField(flds[i]); 70 } 71 final Method [] mtds = type.getDeclaredMethods(); 72 for(int i=0; i<mtds.length; i++){ 73 desc.addMethod(mtds[i]); 74 } 75 final Constructor <T>[] ctors = type.getDeclaredConstructors(); 76 for(int i=0; i<ctors.length; i++){ 77 desc.addConstructor(ctors[i]); 78 } 79 return desc; 80 } 81 } 82 | Popular Tags |