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