1*795d594fSAndroid Build Coastguard Worker import otherpackage.OtherPackageClass; 2*795d594fSAndroid Build Coastguard Worker 3*795d594fSAndroid Build Coastguard Worker import java.io.Serializable; 4*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.AccessibleObject; 5*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Constructor; 6*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Executable; 7*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Field; 8*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.InvocationTargetException; 9*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Method; 10*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Modifier; 11*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Type; 12*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.TypeVariable; 13*795d594fSAndroid Build Coastguard Worker import java.util.ArrayList; 14*795d594fSAndroid Build Coastguard Worker import java.util.Collections; 15*795d594fSAndroid Build Coastguard Worker import java.util.List; 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker public class ClassAttrs { ClassAttrs()18*795d594fSAndroid Build Coastguard Worker ClassAttrs() { 19*795d594fSAndroid Build Coastguard Worker /* local, not anonymous, not member */ 20*795d594fSAndroid Build Coastguard Worker class ConsInnerNamed { 21*795d594fSAndroid Build Coastguard Worker public void showMe() { 22*795d594fSAndroid Build Coastguard Worker printClassAttrs(this.getClass()); 23*795d594fSAndroid Build Coastguard Worker } 24*795d594fSAndroid Build Coastguard Worker } 25*795d594fSAndroid Build Coastguard Worker 26*795d594fSAndroid Build Coastguard Worker ConsInnerNamed cinner = new ConsInnerNamed(); 27*795d594fSAndroid Build Coastguard Worker cinner.showMe(); 28*795d594fSAndroid Build Coastguard Worker } 29*795d594fSAndroid Build Coastguard Worker 30*795d594fSAndroid Build Coastguard Worker public class PublicInnerClass { 31*795d594fSAndroid Build Coastguard Worker } 32*795d594fSAndroid Build Coastguard Worker 33*795d594fSAndroid Build Coastguard Worker protected class ProtectedInnerClass { 34*795d594fSAndroid Build Coastguard Worker } 35*795d594fSAndroid Build Coastguard Worker 36*795d594fSAndroid Build Coastguard Worker private class PrivateInnerClass { 37*795d594fSAndroid Build Coastguard Worker } 38*795d594fSAndroid Build Coastguard Worker 39*795d594fSAndroid Build Coastguard Worker class PackagePrivateInnerClass { 40*795d594fSAndroid Build Coastguard Worker } 41*795d594fSAndroid Build Coastguard Worker 42*795d594fSAndroid Build Coastguard Worker public interface PublicInnerInterface { 43*795d594fSAndroid Build Coastguard Worker } 44*795d594fSAndroid Build Coastguard Worker 45*795d594fSAndroid Build Coastguard Worker protected interface ProtectedInnerInterface { 46*795d594fSAndroid Build Coastguard Worker } 47*795d594fSAndroid Build Coastguard Worker 48*795d594fSAndroid Build Coastguard Worker private interface PrivateInnerInterface { 49*795d594fSAndroid Build Coastguard Worker } 50*795d594fSAndroid Build Coastguard Worker 51*795d594fSAndroid Build Coastguard Worker interface PackagePrivateInnerInterface { 52*795d594fSAndroid Build Coastguard Worker } 53*795d594fSAndroid Build Coastguard Worker showModifiers(Class<?> c)54*795d594fSAndroid Build Coastguard Worker private static void showModifiers(Class<?> c) { 55*795d594fSAndroid Build Coastguard Worker System.out.println(Modifier.toString(c.getModifiers()) + " " + c.getName()); 56*795d594fSAndroid Build Coastguard Worker } 57*795d594fSAndroid Build Coastguard Worker 58*795d594fSAndroid Build Coastguard Worker // https://code.google.com/p/android/issues/detail?id=56267 test56267()59*795d594fSAndroid Build Coastguard Worker private static void test56267() { 60*795d594fSAndroid Build Coastguard Worker // Primitive classes. 61*795d594fSAndroid Build Coastguard Worker showModifiers(int.class); 62*795d594fSAndroid Build Coastguard Worker showModifiers(int[].class); 63*795d594fSAndroid Build Coastguard Worker 64*795d594fSAndroid Build Coastguard Worker // Regular classes. 65*795d594fSAndroid Build Coastguard Worker showModifiers(Object.class); 66*795d594fSAndroid Build Coastguard Worker showModifiers(Object[].class); 67*795d594fSAndroid Build Coastguard Worker 68*795d594fSAndroid Build Coastguard Worker // Inner classes. 69*795d594fSAndroid Build Coastguard Worker showModifiers(PublicInnerClass.class); 70*795d594fSAndroid Build Coastguard Worker showModifiers(PublicInnerClass[].class); 71*795d594fSAndroid Build Coastguard Worker showModifiers(ProtectedInnerClass.class); 72*795d594fSAndroid Build Coastguard Worker showModifiers(ProtectedInnerClass[].class); 73*795d594fSAndroid Build Coastguard Worker showModifiers(PrivateInnerClass.class); 74*795d594fSAndroid Build Coastguard Worker showModifiers(PrivateInnerClass[].class); 75*795d594fSAndroid Build Coastguard Worker showModifiers(PackagePrivateInnerClass.class); 76*795d594fSAndroid Build Coastguard Worker showModifiers(PackagePrivateInnerClass[].class); 77*795d594fSAndroid Build Coastguard Worker 78*795d594fSAndroid Build Coastguard Worker // Regular interfaces. 79*795d594fSAndroid Build Coastguard Worker showModifiers(Serializable.class); 80*795d594fSAndroid Build Coastguard Worker showModifiers(Serializable[].class); 81*795d594fSAndroid Build Coastguard Worker 82*795d594fSAndroid Build Coastguard Worker // Inner interfaces. 83*795d594fSAndroid Build Coastguard Worker showModifiers(PublicInnerInterface.class); 84*795d594fSAndroid Build Coastguard Worker showModifiers(PublicInnerInterface[].class); 85*795d594fSAndroid Build Coastguard Worker showModifiers(ProtectedInnerInterface.class); 86*795d594fSAndroid Build Coastguard Worker showModifiers(ProtectedInnerInterface[].class); 87*795d594fSAndroid Build Coastguard Worker showModifiers(PrivateInnerInterface.class); 88*795d594fSAndroid Build Coastguard Worker showModifiers(PrivateInnerInterface[].class); 89*795d594fSAndroid Build Coastguard Worker showModifiers(PackagePrivateInnerInterface.class); 90*795d594fSAndroid Build Coastguard Worker showModifiers(PackagePrivateInnerInterface[].class); 91*795d594fSAndroid Build Coastguard Worker } 92*795d594fSAndroid Build Coastguard Worker main()93*795d594fSAndroid Build Coastguard Worker public static void main() { 94*795d594fSAndroid Build Coastguard Worker test56267(); 95*795d594fSAndroid Build Coastguard Worker 96*795d594fSAndroid Build Coastguard Worker printClassAttrs(ClassAttrs.class); 97*795d594fSAndroid Build Coastguard Worker printClassAttrs(OtherClass.class); 98*795d594fSAndroid Build Coastguard Worker printClassAttrs(OtherPackageClass.class); 99*795d594fSAndroid Build Coastguard Worker 100*795d594fSAndroid Build Coastguard Worker /* local, not anonymous, not member */ 101*795d594fSAndroid Build Coastguard Worker class InnerNamed { 102*795d594fSAndroid Build Coastguard Worker public void showMe() { 103*795d594fSAndroid Build Coastguard Worker printClassAttrs(this.getClass()); 104*795d594fSAndroid Build Coastguard Worker } 105*795d594fSAndroid Build Coastguard Worker } 106*795d594fSAndroid Build Coastguard Worker InnerNamed inner = new InnerNamed(); 107*795d594fSAndroid Build Coastguard Worker inner.showMe(); 108*795d594fSAndroid Build Coastguard Worker 109*795d594fSAndroid Build Coastguard Worker ClassAttrs attrs = new ClassAttrs(); 110*795d594fSAndroid Build Coastguard Worker try { 111*795d594fSAndroid Build Coastguard Worker /* anonymous, not local, not member */ 112*795d594fSAndroid Build Coastguard Worker printClassAttrs(Class.forName("ClassAttrs$1")); // ClassAttrs$1.j 113*795d594fSAndroid Build Coastguard Worker } catch (ClassNotFoundException e) { 114*795d594fSAndroid Build Coastguard Worker System.out.println("FAILED: " + e); 115*795d594fSAndroid Build Coastguard Worker e.printStackTrace(System.out); 116*795d594fSAndroid Build Coastguard Worker throw new AssertionError(e); 117*795d594fSAndroid Build Coastguard Worker } 118*795d594fSAndroid Build Coastguard Worker 119*795d594fSAndroid Build Coastguard Worker /* member, not anonymous, not local */ 120*795d594fSAndroid Build Coastguard Worker printClassAttrs(MemberClass.class); 121*795d594fSAndroid Build Coastguard Worker 122*795d594fSAndroid Build Coastguard Worker /* fancy */ 123*795d594fSAndroid Build Coastguard Worker printClassAttrs(FancyClass.class); 124*795d594fSAndroid Build Coastguard Worker 125*795d594fSAndroid Build Coastguard Worker try { 126*795d594fSAndroid Build Coastguard Worker Constructor<?> cons; 127*795d594fSAndroid Build Coastguard Worker cons = MemberClass.class.getConstructor(MemberClass.class); 128*795d594fSAndroid Build Coastguard Worker System.out.println("constructor signature: " 129*795d594fSAndroid Build Coastguard Worker + getSignatureAttribute(cons)); 130*795d594fSAndroid Build Coastguard Worker 131*795d594fSAndroid Build Coastguard Worker Method meth; 132*795d594fSAndroid Build Coastguard Worker meth = MemberClass.class.getMethod("foo"); 133*795d594fSAndroid Build Coastguard Worker System.out.println("method signature: " 134*795d594fSAndroid Build Coastguard Worker + getSignatureAttribute(meth)); 135*795d594fSAndroid Build Coastguard Worker 136*795d594fSAndroid Build Coastguard Worker Field field; 137*795d594fSAndroid Build Coastguard Worker field = MemberClass.class.getField("mWha"); 138*795d594fSAndroid Build Coastguard Worker System.out.println("field signature: " 139*795d594fSAndroid Build Coastguard Worker + getSignatureAttribute(field)); 140*795d594fSAndroid Build Coastguard Worker } catch (NoSuchMethodException nsme) { 141*795d594fSAndroid Build Coastguard Worker System.out.println("FAILED: " + nsme); 142*795d594fSAndroid Build Coastguard Worker } catch (NoSuchFieldException nsfe) { 143*795d594fSAndroid Build Coastguard Worker System.out.println("FAILED: " + nsfe); 144*795d594fSAndroid Build Coastguard Worker } catch (RuntimeException re) { 145*795d594fSAndroid Build Coastguard Worker System.out.println("FAILED: " + re); 146*795d594fSAndroid Build Coastguard Worker re.printStackTrace(System.out); 147*795d594fSAndroid Build Coastguard Worker } 148*795d594fSAndroid Build Coastguard Worker 149*795d594fSAndroid Build Coastguard Worker test_isAssignableFrom(); 150*795d594fSAndroid Build Coastguard Worker test_isInstance(); 151*795d594fSAndroid Build Coastguard Worker } 152*795d594fSAndroid Build Coastguard Worker test_isAssignableFrom()153*795d594fSAndroid Build Coastguard Worker private static void test_isAssignableFrom() { 154*795d594fSAndroid Build Coastguard Worker // Can always assign to things of the same type. 155*795d594fSAndroid Build Coastguard Worker assertTrue(String.class.isAssignableFrom(String.class)); 156*795d594fSAndroid Build Coastguard Worker 157*795d594fSAndroid Build Coastguard Worker // Can assign any reference to java.lang.Object. 158*795d594fSAndroid Build Coastguard Worker assertTrue(Object.class.isAssignableFrom(Object.class)); 159*795d594fSAndroid Build Coastguard Worker assertTrue(Object.class.isAssignableFrom(Class.class)); 160*795d594fSAndroid Build Coastguard Worker assertTrue(Object.class.isAssignableFrom(String.class)); 161*795d594fSAndroid Build Coastguard Worker assertFalse(Object.class.isAssignableFrom(int.class)); 162*795d594fSAndroid Build Coastguard Worker assertFalse(Object.class.isAssignableFrom(long.class)); 163*795d594fSAndroid Build Coastguard Worker 164*795d594fSAndroid Build Coastguard Worker // Interfaces. 165*795d594fSAndroid Build Coastguard Worker assertTrue(CharSequence.class.isAssignableFrom(String.class)); 166*795d594fSAndroid Build Coastguard Worker assertFalse(CharSequence.class.isAssignableFrom(Object.class)); 167*795d594fSAndroid Build Coastguard Worker 168*795d594fSAndroid Build Coastguard Worker // Superclasses. 169*795d594fSAndroid Build Coastguard Worker assertTrue(AccessibleObject.class.isAssignableFrom(Method.class)); 170*795d594fSAndroid Build Coastguard Worker assertFalse(Method.class.isAssignableFrom(AccessibleObject.class)); 171*795d594fSAndroid Build Coastguard Worker 172*795d594fSAndroid Build Coastguard Worker // Arrays. 173*795d594fSAndroid Build Coastguard Worker assertTrue(int[].class.isAssignableFrom(int[].class)); 174*795d594fSAndroid Build Coastguard Worker assertFalse(int[].class.isAssignableFrom(char[].class)); 175*795d594fSAndroid Build Coastguard Worker assertFalse(char[].class.isAssignableFrom(int[].class)); 176*795d594fSAndroid Build Coastguard Worker assertTrue(Object.class.isAssignableFrom(int[].class)); 177*795d594fSAndroid Build Coastguard Worker assertFalse(int[].class.isAssignableFrom(Object.class)); 178*795d594fSAndroid Build Coastguard Worker 179*795d594fSAndroid Build Coastguard Worker try { 180*795d594fSAndroid Build Coastguard Worker assertFalse(Object.class.isAssignableFrom(null)); 181*795d594fSAndroid Build Coastguard Worker fail(); 182*795d594fSAndroid Build Coastguard Worker } catch (NullPointerException expected) { 183*795d594fSAndroid Build Coastguard Worker } 184*795d594fSAndroid Build Coastguard Worker } 185*795d594fSAndroid Build Coastguard Worker test_isInstance()186*795d594fSAndroid Build Coastguard Worker private static void test_isInstance() { 187*795d594fSAndroid Build Coastguard Worker // Can always assign to things of the same type. 188*795d594fSAndroid Build Coastguard Worker assertTrue(String.class.isInstance("hello")); 189*795d594fSAndroid Build Coastguard Worker 190*795d594fSAndroid Build Coastguard Worker // Can assign any reference to java.lang.Object. 191*795d594fSAndroid Build Coastguard Worker assertTrue(Object.class.isInstance(new Object())); 192*795d594fSAndroid Build Coastguard Worker assertTrue(Object.class.isInstance(Class.class)); 193*795d594fSAndroid Build Coastguard Worker assertTrue(Object.class.isInstance("hello")); 194*795d594fSAndroid Build Coastguard Worker 195*795d594fSAndroid Build Coastguard Worker // Interfaces. 196*795d594fSAndroid Build Coastguard Worker assertTrue(CharSequence.class.isInstance("hello")); 197*795d594fSAndroid Build Coastguard Worker assertFalse(CharSequence.class.isInstance(new Object())); 198*795d594fSAndroid Build Coastguard Worker 199*795d594fSAndroid Build Coastguard Worker // Superclasses. 200*795d594fSAndroid Build Coastguard Worker assertTrue(AccessibleObject.class.isInstance(Method.class.getDeclaredMethods()[0])); 201*795d594fSAndroid Build Coastguard Worker assertFalse(Method.class.isInstance(Method.class.getDeclaredFields()[0])); 202*795d594fSAndroid Build Coastguard Worker 203*795d594fSAndroid Build Coastguard Worker // Arrays. 204*795d594fSAndroid Build Coastguard Worker assertTrue(int[].class.isInstance(new int[0])); 205*795d594fSAndroid Build Coastguard Worker assertFalse(int[].class.isInstance(new char[0])); 206*795d594fSAndroid Build Coastguard Worker assertFalse(char[].class.isInstance(new int[0])); 207*795d594fSAndroid Build Coastguard Worker assertTrue(Object.class.isInstance(new int[0])); 208*795d594fSAndroid Build Coastguard Worker assertFalse(int[].class.isInstance(new Object())); 209*795d594fSAndroid Build Coastguard Worker 210*795d594fSAndroid Build Coastguard Worker assertFalse(Object.class.isInstance(null)); 211*795d594fSAndroid Build Coastguard Worker } 212*795d594fSAndroid Build Coastguard Worker assertTrue(boolean b)213*795d594fSAndroid Build Coastguard Worker private static void assertTrue(boolean b) { 214*795d594fSAndroid Build Coastguard Worker if (!b) throw new RuntimeException(); 215*795d594fSAndroid Build Coastguard Worker } 216*795d594fSAndroid Build Coastguard Worker assertFalse(boolean b)217*795d594fSAndroid Build Coastguard Worker private static void assertFalse(boolean b) { 218*795d594fSAndroid Build Coastguard Worker if (b) throw new RuntimeException(); 219*795d594fSAndroid Build Coastguard Worker } 220*795d594fSAndroid Build Coastguard Worker fail()221*795d594fSAndroid Build Coastguard Worker private static void fail() { 222*795d594fSAndroid Build Coastguard Worker throw new RuntimeException(); 223*795d594fSAndroid Build Coastguard Worker } 224*795d594fSAndroid Build Coastguard Worker 225*795d594fSAndroid Build Coastguard Worker /* to call the (out-of-scope) <code>getSignatureAttribute</code> methods */ getSignatureAttribute(Object obj)226*795d594fSAndroid Build Coastguard Worker public static String getSignatureAttribute(Object obj) { 227*795d594fSAndroid Build Coastguard Worker Method method; 228*795d594fSAndroid Build Coastguard Worker try { 229*795d594fSAndroid Build Coastguard Worker Class<?> c = obj.getClass(); 230*795d594fSAndroid Build Coastguard Worker if (c == Method.class || c == Constructor.class) { 231*795d594fSAndroid Build Coastguard Worker c = Executable.class; 232*795d594fSAndroid Build Coastguard Worker } 233*795d594fSAndroid Build Coastguard Worker method = c.getDeclaredMethod("getSignatureAttribute"); 234*795d594fSAndroid Build Coastguard Worker method.setAccessible(true); 235*795d594fSAndroid Build Coastguard Worker } catch (Exception ex) { 236*795d594fSAndroid Build Coastguard Worker ex.printStackTrace(System.out); 237*795d594fSAndroid Build Coastguard Worker return "<unknown>"; 238*795d594fSAndroid Build Coastguard Worker } 239*795d594fSAndroid Build Coastguard Worker 240*795d594fSAndroid Build Coastguard Worker try { 241*795d594fSAndroid Build Coastguard Worker return (String) method.invoke(obj); 242*795d594fSAndroid Build Coastguard Worker } catch (IllegalAccessException ex) { 243*795d594fSAndroid Build Coastguard Worker throw new RuntimeException(ex); 244*795d594fSAndroid Build Coastguard Worker } catch (InvocationTargetException ex) { 245*795d594fSAndroid Build Coastguard Worker throw new RuntimeException(ex); 246*795d594fSAndroid Build Coastguard Worker } 247*795d594fSAndroid Build Coastguard Worker } 248*795d594fSAndroid Build Coastguard Worker 249*795d594fSAndroid Build Coastguard Worker /* for reflection testing */ 250*795d594fSAndroid Build Coastguard Worker static class MemberClass<XYZ> { 251*795d594fSAndroid Build Coastguard Worker public MemberClass<XYZ> mWha; 252*795d594fSAndroid Build Coastguard Worker MemberClass(MemberClass<XYZ> memb)253*795d594fSAndroid Build Coastguard Worker public MemberClass(MemberClass<XYZ> memb) { 254*795d594fSAndroid Build Coastguard Worker mWha = memb; 255*795d594fSAndroid Build Coastguard Worker } 256*795d594fSAndroid Build Coastguard Worker foo()257*795d594fSAndroid Build Coastguard Worker public Class<XYZ> foo() throws NoSuchMethodException { 258*795d594fSAndroid Build Coastguard Worker return null; 259*795d594fSAndroid Build Coastguard Worker } 260*795d594fSAndroid Build Coastguard Worker } 261*795d594fSAndroid Build Coastguard Worker 262*795d594fSAndroid Build Coastguard Worker /* for reflection testing (getClasses vs getDeclaredClasses) */ 263*795d594fSAndroid Build Coastguard Worker static public class PublicMemberClass { 264*795d594fSAndroid Build Coastguard Worker float mBlah; 265*795d594fSAndroid Build Coastguard Worker } 266*795d594fSAndroid Build Coastguard Worker 267*795d594fSAndroid Build Coastguard Worker /* 268*795d594fSAndroid Build Coastguard Worker * Dump a variety of class attributes. 269*795d594fSAndroid Build Coastguard Worker */ printClassAttrs(Class<T> clazz)270*795d594fSAndroid Build Coastguard Worker public static <T> void printClassAttrs(Class<T> clazz) { 271*795d594fSAndroid Build Coastguard Worker System.out.println("***** " + clazz + ":"); 272*795d594fSAndroid Build Coastguard Worker 273*795d594fSAndroid Build Coastguard Worker System.out.println(" name: " 274*795d594fSAndroid Build Coastguard Worker + clazz.getName()); 275*795d594fSAndroid Build Coastguard Worker System.out.println(" canonical: " 276*795d594fSAndroid Build Coastguard Worker + clazz.getCanonicalName()); 277*795d594fSAndroid Build Coastguard Worker System.out.println(" simple: " 278*795d594fSAndroid Build Coastguard Worker + clazz.getSimpleName()); 279*795d594fSAndroid Build Coastguard Worker System.out.println(" genericSignature: " 280*795d594fSAndroid Build Coastguard Worker + getSignatureAttribute(clazz)); 281*795d594fSAndroid Build Coastguard Worker 282*795d594fSAndroid Build Coastguard Worker System.out.println(" super: " 283*795d594fSAndroid Build Coastguard Worker + clazz.getSuperclass()); 284*795d594fSAndroid Build Coastguard Worker System.out.println(" genericSuperclass: " 285*795d594fSAndroid Build Coastguard Worker + clazz.getGenericSuperclass()); 286*795d594fSAndroid Build Coastguard Worker System.out.println(" declaring: " 287*795d594fSAndroid Build Coastguard Worker + clazz.getDeclaringClass()); 288*795d594fSAndroid Build Coastguard Worker System.out.println(" enclosing: " 289*795d594fSAndroid Build Coastguard Worker + clazz.getEnclosingClass()); 290*795d594fSAndroid Build Coastguard Worker System.out.println(" enclosingCon: " 291*795d594fSAndroid Build Coastguard Worker + clazz.getEnclosingConstructor()); 292*795d594fSAndroid Build Coastguard Worker System.out.println(" enclosingMeth: " 293*795d594fSAndroid Build Coastguard Worker + clazz.getEnclosingMethod()); 294*795d594fSAndroid Build Coastguard Worker System.out.println(" modifiers: " 295*795d594fSAndroid Build Coastguard Worker + clazz.getModifiers()); 296*795d594fSAndroid Build Coastguard Worker System.out.println(" package: " 297*795d594fSAndroid Build Coastguard Worker + clazz.getPackage()); 298*795d594fSAndroid Build Coastguard Worker 299*795d594fSAndroid Build Coastguard Worker System.out.println(" declaredClasses: " 300*795d594fSAndroid Build Coastguard Worker + stringifyTypeArray(clazz.getDeclaredClasses())); 301*795d594fSAndroid Build Coastguard Worker System.out.println(" member classes: " 302*795d594fSAndroid Build Coastguard Worker + stringifyTypeArray(clazz.getClasses())); 303*795d594fSAndroid Build Coastguard Worker 304*795d594fSAndroid Build Coastguard Worker System.out.println(" isAnnotation: " 305*795d594fSAndroid Build Coastguard Worker + clazz.isAnnotation()); 306*795d594fSAndroid Build Coastguard Worker System.out.println(" isAnonymous: " 307*795d594fSAndroid Build Coastguard Worker + clazz.isAnonymousClass()); 308*795d594fSAndroid Build Coastguard Worker System.out.println(" isArray: " 309*795d594fSAndroid Build Coastguard Worker + clazz.isArray()); 310*795d594fSAndroid Build Coastguard Worker System.out.println(" isEnum: " 311*795d594fSAndroid Build Coastguard Worker + clazz.isEnum()); 312*795d594fSAndroid Build Coastguard Worker System.out.println(" isInterface: " 313*795d594fSAndroid Build Coastguard Worker + clazz.isInterface()); 314*795d594fSAndroid Build Coastguard Worker System.out.println(" isLocalClass: " 315*795d594fSAndroid Build Coastguard Worker + clazz.isLocalClass()); 316*795d594fSAndroid Build Coastguard Worker System.out.println(" isMemberClass: " 317*795d594fSAndroid Build Coastguard Worker + clazz.isMemberClass()); 318*795d594fSAndroid Build Coastguard Worker System.out.println(" isPrimitive: " 319*795d594fSAndroid Build Coastguard Worker + clazz.isPrimitive()); 320*795d594fSAndroid Build Coastguard Worker System.out.println(" isSynthetic: " 321*795d594fSAndroid Build Coastguard Worker + clazz.isSynthetic()); 322*795d594fSAndroid Build Coastguard Worker 323*795d594fSAndroid Build Coastguard Worker System.out.println(" genericInterfaces: " 324*795d594fSAndroid Build Coastguard Worker + stringifyTypeArray(clazz.getGenericInterfaces())); 325*795d594fSAndroid Build Coastguard Worker 326*795d594fSAndroid Build Coastguard Worker TypeVariable<Class<T>>[] typeParameters = clazz.getTypeParameters(); 327*795d594fSAndroid Build Coastguard Worker System.out.println(" typeParameters: " 328*795d594fSAndroid Build Coastguard Worker + stringifyTypeArray(typeParameters)); 329*795d594fSAndroid Build Coastguard Worker } 330*795d594fSAndroid Build Coastguard Worker 331*795d594fSAndroid Build Coastguard Worker /* 332*795d594fSAndroid Build Coastguard Worker * Convert an array of Type into a string. Start with an array count. 333*795d594fSAndroid Build Coastguard Worker */ stringifyTypeArray(Type[] types)334*795d594fSAndroid Build Coastguard Worker private static String stringifyTypeArray(Type[] types) { 335*795d594fSAndroid Build Coastguard Worker List<String> typeStringList = new ArrayList<String>(); 336*795d594fSAndroid Build Coastguard Worker for (Type t : types) { 337*795d594fSAndroid Build Coastguard Worker typeStringList.add(t.toString()); 338*795d594fSAndroid Build Coastguard Worker } 339*795d594fSAndroid Build Coastguard Worker // Sort types alphabetically so they're always printed in the same order. 340*795d594fSAndroid Build Coastguard Worker // For instance, Class.getClasses() does not guarantee any order for the 341*795d594fSAndroid Build Coastguard Worker // returned Class[]. 342*795d594fSAndroid Build Coastguard Worker Collections.sort(typeStringList); 343*795d594fSAndroid Build Coastguard Worker 344*795d594fSAndroid Build Coastguard Worker StringBuilder stb = new StringBuilder(); 345*795d594fSAndroid Build Coastguard Worker boolean first = true; 346*795d594fSAndroid Build Coastguard Worker 347*795d594fSAndroid Build Coastguard Worker stb.append("[" + types.length + "]"); 348*795d594fSAndroid Build Coastguard Worker 349*795d594fSAndroid Build Coastguard Worker for (String typeString : typeStringList) { 350*795d594fSAndroid Build Coastguard Worker if (first) { 351*795d594fSAndroid Build Coastguard Worker stb.append(" "); 352*795d594fSAndroid Build Coastguard Worker first = false; 353*795d594fSAndroid Build Coastguard Worker } else { 354*795d594fSAndroid Build Coastguard Worker stb.append(", "); 355*795d594fSAndroid Build Coastguard Worker } 356*795d594fSAndroid Build Coastguard Worker stb.append(typeString); 357*795d594fSAndroid Build Coastguard Worker } 358*795d594fSAndroid Build Coastguard Worker 359*795d594fSAndroid Build Coastguard Worker return stb.toString(); 360*795d594fSAndroid Build Coastguard Worker } 361*795d594fSAndroid Build Coastguard Worker } 362