xref: /aosp_15_r20/art/test/031-class-attributes/src/ClassAttrs.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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