1 import otherpackage.OtherPackageClass; 2 3 import java.lang.reflect.AccessibleObject; 4 import java.lang.reflect.Constructor; 5 import java.lang.reflect.Field; 6 import java.lang.reflect.InvocationTargetException; 7 import java.lang.reflect.Method; 8 import java.lang.reflect.Type; 9 import java.lang.reflect.TypeVariable; 10 11 public class ClassAttrs { ClassAttrs()12 ClassAttrs() { 13 /* local, not anonymous, not member */ 14 class ConsInnerNamed { 15 public void showMe() { 16 printClassAttrs(this.getClass()); 17 } 18 } 19 20 ConsInnerNamed cinner = new ConsInnerNamed(); 21 cinner.showMe(); 22 } 23 main()24 public static void main() { 25 printClassAttrs(ClassAttrs.class); 26 printClassAttrs(OtherClass.class); 27 printClassAttrs(OtherPackageClass.class); 28 29 /* local, not anonymous, not member */ 30 class InnerNamed { 31 public void showMe() { 32 printClassAttrs(this.getClass()); 33 } 34 } 35 InnerNamed inner = new InnerNamed(); 36 inner.showMe(); 37 38 ClassAttrs attrs = new ClassAttrs(); 39 40 /* anonymous, not local, not member */ 41 printClassAttrs((new OtherClass() { int i = 5; }).getClass()); 42 43 /* member, not anonymous, not local */ 44 printClassAttrs(MemberClass.class); 45 46 /* fancy */ 47 printClassAttrs(FancyClass.class); 48 49 try { 50 Constructor cons; 51 cons = MemberClass.class.getConstructor( 52 new Class[] { MemberClass.class }); 53 System.out.println("constructor signature: " 54 + getSignatureAttribute(cons)); 55 56 Method meth; 57 meth = MemberClass.class.getMethod("foo", (Class[]) null); 58 System.out.println("method signature: " 59 + getSignatureAttribute(meth)); 60 61 Field field; 62 field = MemberClass.class.getField("mWha"); 63 System.out.println("field signature: " 64 + getSignatureAttribute(field)); 65 } catch (NoSuchMethodException nsme) { 66 System.err.println("FAILED: " + nsme); 67 } catch (NoSuchFieldException nsfe) { 68 System.err.println("FAILED: " + nsfe); 69 } catch (RuntimeException re) { 70 System.err.println("FAILED: " + re); 71 re.printStackTrace(); 72 } 73 } 74 75 /* to call the (out-of-scope) <code>getSignatureAttribute</code> methods */ getSignatureAttribute(Object obj)76 public static String getSignatureAttribute(Object obj) { 77 Method method; 78 try { 79 if (obj instanceof AccessibleObject) { 80 method = AccessibleObject.class.getDeclaredMethod( 81 "getSignatureAttribute"); 82 } else { 83 // Should be a Class. 84 method = Class.class.getDeclaredMethod( 85 "getSignatureAttribute"); 86 } 87 method.setAccessible(true); 88 } catch (NoSuchMethodException ex) { 89 //System.err.println("getSignatureAttribute() not defined."); 90 //ex.printStackTrace(); 91 return "<unknown>"; 92 } 93 94 try { 95 return (String) method.invoke(obj); 96 } catch (IllegalAccessException ex) { 97 throw new RuntimeException(ex); 98 } catch (InvocationTargetException ex) { 99 throw new RuntimeException(ex); 100 } 101 } 102 103 /* for reflection testing */ 104 static class MemberClass<XYZ> { 105 public MemberClass<XYZ> mWha; 106 MemberClass(MemberClass<XYZ> memb)107 public MemberClass(MemberClass<XYZ> memb) { 108 mWha = memb; 109 } 110 foo()111 public Class<XYZ> foo() throws NoSuchMethodException { 112 return null; 113 } 114 } 115 116 /* for reflection testing (getClasses vs getDeclaredClasses) */ 117 static public class PublicMemberClass { 118 float mBlah; 119 } 120 121 /* 122 * Dump a variety of class attributes. 123 */ printClassAttrs(Class clazz)124 public static void printClassAttrs(Class clazz) { 125 Class clazz2; 126 127 System.out.println("***** " + clazz + ":"); 128 129 System.out.println(" name: " 130 + clazz.getName()); 131 System.out.println(" canonical: " 132 + clazz.getCanonicalName()); 133 System.out.println(" simple: " 134 + clazz.getSimpleName()); 135 System.out.println(" genericSignature: " 136 + getSignatureAttribute(clazz)); 137 138 System.out.println(" super: " 139 + clazz.getSuperclass()); 140 System.out.println(" genericSuperclass: " 141 + clazz.getGenericSuperclass()); 142 System.out.println(" declaring: " 143 + clazz.getDeclaringClass()); 144 System.out.println(" enclosing: " 145 + clazz.getEnclosingClass()); 146 System.out.println(" enclosingCon: " 147 + clazz.getEnclosingConstructor()); 148 System.out.println(" enclosingMeth: " 149 + clazz.getEnclosingMethod()); 150 System.out.println(" modifiers: " 151 + clazz.getModifiers()); 152 System.out.println(" package: " 153 + clazz.getPackage()); 154 155 System.out.println(" declaredClasses: " 156 + stringifyTypeArray(clazz.getDeclaredClasses())); 157 System.out.println(" member classes: " 158 + stringifyTypeArray(clazz.getClasses())); 159 160 System.out.println(" isAnnotation: " 161 + clazz.isAnnotation()); 162 System.out.println(" isAnonymous: " 163 + clazz.isAnonymousClass()); 164 System.out.println(" isArray: " 165 + clazz.isArray()); 166 System.out.println(" isEnum: " 167 + clazz.isEnum()); 168 System.out.println(" isInterface: " 169 + clazz.isInterface()); 170 System.out.println(" isLocalClass: " 171 + clazz.isLocalClass()); 172 System.out.println(" isMemberClass: " 173 + clazz.isMemberClass()); 174 System.out.println(" isPrimitive: " 175 + clazz.isPrimitive()); 176 System.out.println(" isSynthetic: " 177 + clazz.isSynthetic()); 178 179 System.out.println(" genericInterfaces: " 180 + stringifyTypeArray(clazz.getGenericInterfaces())); 181 182 TypeVariable<Class<?>>[] typeParameters = clazz.getTypeParameters(); 183 System.out.println(" typeParameters: " 184 + stringifyTypeArray(typeParameters)); 185 } 186 187 /* 188 * Convert an array of Type into a string. Start with an array count. 189 */ stringifyTypeArray(Type[] types)190 private static String stringifyTypeArray(Type[] types) { 191 StringBuilder stb = new StringBuilder(); 192 boolean first = true; 193 194 stb.append("[" + types.length + "]"); 195 196 for (Type t: types) { 197 if (first) { 198 stb.append(" "); 199 first = false; 200 } else { 201 stb.append(", "); 202 } 203 stb.append(t.toString()); 204 } 205 206 return stb.toString(); 207 } 208 } 209