blob: c3c61bfaedf91dbf40b2502a58de7a0aa2563f47 [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;
Elliott Hughes741b5b72012-01-31 19:18:51 -08009import java.lang.reflect.TypeVariable;
jeffhao5d1ac922011-09-29 17:41:15 -070010
11public class 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
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
Elliott Hughes741b5b72012-01-31 19:18:51 -080046 /* fancy */
47 printClassAttrs(FancyClass.class);
48
jeffhao5d1ac922011-09-29 17:41:15 -070049 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 */
76 public static String getSignatureAttribute(Object obj) {
77 Method method;
78 try {
Elliott Hughes32caed42011-10-06 13:41:44 -070079 Class c = Class.forName("libcore.reflect.AnnotationAccess");
80 method = c.getDeclaredMethod("getSignature", java.lang.reflect.AnnotatedElement.class);
jeffhao5d1ac922011-09-29 17:41:15 -070081 method.setAccessible(true);
Elliott Hughes32caed42011-10-06 13:41:44 -070082 } catch (Exception ex) {
jeffhao5d1ac922011-09-29 17:41:15 -070083 ex.printStackTrace();
84 return "<unknown>";
85 }
86
87 try {
Elliott Hughes32caed42011-10-06 13:41:44 -070088 return (String) method.invoke(null, obj);
jeffhao5d1ac922011-09-29 17:41:15 -070089 } catch (IllegalAccessException ex) {
90 throw new RuntimeException(ex);
91 } catch (InvocationTargetException ex) {
92 throw new RuntimeException(ex);
93 }
94 }
95
96 /* for reflection testing */
97 static class MemberClass<XYZ> {
98 public MemberClass<XYZ> mWha;
99
100 public MemberClass(MemberClass<XYZ> memb) {
101 mWha = memb;
102 }
103
104 public Class<XYZ> foo() throws NoSuchMethodException {
105 return null;
106 }
107 }
108
109 /* for reflection testing (getClasses vs getDeclaredClasses) */
110 static public class PublicMemberClass {
111 float mBlah;
112 }
113
114 /*
115 * Dump a variety of class attributes.
116 */
117 public static void printClassAttrs(Class clazz) {
jeffhao5d1ac922011-09-29 17:41:15 -0700118 Class clazz2;
119
120 System.out.println("***** " + clazz + ":");
121
122 System.out.println(" name: "
123 + clazz.getName());
124 System.out.println(" canonical: "
125 + clazz.getCanonicalName());
126 System.out.println(" simple: "
127 + clazz.getSimpleName());
128 System.out.println(" genericSignature: "
129 + getSignatureAttribute(clazz));
130
131 System.out.println(" super: "
132 + clazz.getSuperclass());
Elliott Hughes741b5b72012-01-31 19:18:51 -0800133 System.out.println(" genericSuperclass: "
jeffhao5d1ac922011-09-29 17:41:15 -0700134 + clazz.getGenericSuperclass());
135 System.out.println(" declaring: "
136 + clazz.getDeclaringClass());
137 System.out.println(" enclosing: "
138 + clazz.getEnclosingClass());
139 System.out.println(" enclosingCon: "
140 + clazz.getEnclosingConstructor());
141 System.out.println(" enclosingMeth: "
142 + clazz.getEnclosingMethod());
143 System.out.println(" modifiers: "
144 + clazz.getModifiers());
145 System.out.println(" package: "
146 + clazz.getPackage());
147
148 System.out.println(" declaredClasses: "
149 + stringifyTypeArray(clazz.getDeclaredClasses()));
150 System.out.println(" member classes: "
151 + stringifyTypeArray(clazz.getClasses()));
152
153 System.out.println(" isAnnotation: "
154 + clazz.isAnnotation());
155 System.out.println(" isAnonymous: "
156 + clazz.isAnonymousClass());
157 System.out.println(" isArray: "
158 + clazz.isArray());
159 System.out.println(" isEnum: "
160 + clazz.isEnum());
161 System.out.println(" isInterface: "
162 + clazz.isInterface());
163 System.out.println(" isLocalClass: "
164 + clazz.isLocalClass());
165 System.out.println(" isMemberClass: "
166 + clazz.isMemberClass());
167 System.out.println(" isPrimitive: "
168 + clazz.isPrimitive());
169 System.out.println(" isSynthetic: "
170 + clazz.isSynthetic());
171
Elliott Hughes741b5b72012-01-31 19:18:51 -0800172 System.out.println(" genericInterfaces: "
jeffhao5d1ac922011-09-29 17:41:15 -0700173 + stringifyTypeArray(clazz.getGenericInterfaces()));
Elliott Hughes741b5b72012-01-31 19:18:51 -0800174
175 TypeVariable<Class<?>>[] typeParameters = clazz.getTypeParameters();
176 System.out.println(" typeParameters: "
177 + stringifyTypeArray(typeParameters));
jeffhao5d1ac922011-09-29 17:41:15 -0700178 }
179
180 /*
181 * Convert an array of Type into a string. Start with an array count.
182 */
183 private static String stringifyTypeArray(Type[] types) {
184 StringBuilder stb = new StringBuilder();
185 boolean first = true;
186
187 stb.append("[" + types.length + "]");
188
189 for (Type t: types) {
190 if (first) {
191 stb.append(" ");
192 first = false;
193 } else {
194 stb.append(", ");
195 }
196 stb.append(t.toString());
197 }
198
199 return stb.toString();
200 }
201}