• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
10 public class ClassAttrs {
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 
main()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 */
getSignatureAttribute(Object obj)72     public static String getSignatureAttribute(Object obj) {
73         Method method;
74         try {
75             if (obj instanceof AccessibleObject) {
76                 method = AccessibleObject.class.getDeclaredMethod(
77                         "getSignatureAttribute");
78             } else {
79                 // Should be a Class.
80                 method = Class.class.getDeclaredMethod(
81                         "getSignatureAttribute");
82             }
83             method.setAccessible(true);
84         } catch (NoSuchMethodException ex) {
85             System.err.println("getSignatureAttribute() not defined.");
86             ex.printStackTrace();
87             return "<unknown>";
88         }
89 
90         try {
91             return (String) method.invoke(obj);
92         } catch (IllegalAccessException ex) {
93             throw new RuntimeException(ex);
94         } catch (InvocationTargetException ex) {
95             throw new RuntimeException(ex);
96         }
97     }
98 
99     /* for reflection testing */
100     static class MemberClass<XYZ> {
101         public MemberClass<XYZ> mWha;
102 
MemberClass(MemberClass<XYZ> memb)103         public MemberClass(MemberClass<XYZ> memb) {
104             mWha = memb;
105         }
106 
foo()107         public Class<XYZ> foo() throws NoSuchMethodException {
108             return null;
109         }
110     }
111 
112     /* for reflection testing (getClasses vs getDeclaredClasses) */
113     static public class PublicMemberClass {
114         float mBlah;
115     }
116 
117     /*
118      * Dump a variety of class attributes.
119      */
printClassAttrs(Class clazz)120     public static void printClassAttrs(Class clazz) {
121         final boolean WORKING = false;
122         Class clazz2;
123 
124         System.out.println("***** " + clazz + ":");
125 
126         System.out.println("  name: "
127             + clazz.getName());
128         System.out.println("  canonical: "
129             + clazz.getCanonicalName());
130         System.out.println("  simple: "
131             + clazz.getSimpleName());
132         System.out.println("  genericSignature: "
133             + getSignatureAttribute(clazz));
134 
135         System.out.println("  super: "
136             + clazz.getSuperclass());
137         if (WORKING) System.out.println("  genericSuperclass: "
138             + clazz.getGenericSuperclass());
139         System.out.println("  declaring: "
140             + clazz.getDeclaringClass());
141         System.out.println("  enclosing: "
142             + clazz.getEnclosingClass());
143         System.out.println("  enclosingCon: "
144             + clazz.getEnclosingConstructor());
145         System.out.println("  enclosingMeth: "
146             + clazz.getEnclosingMethod());
147         System.out.println("  modifiers: "
148             + clazz.getModifiers());
149         System.out.println("  package: "
150             + clazz.getPackage());
151 
152         System.out.println("  declaredClasses: "
153             + stringifyTypeArray(clazz.getDeclaredClasses()));
154         System.out.println("  member classes: "
155             + stringifyTypeArray(clazz.getClasses()));
156 
157         System.out.println("  isAnnotation: "
158             + clazz.isAnnotation());
159         System.out.println("  isAnonymous: "
160             + clazz.isAnonymousClass());
161         System.out.println("  isArray: "
162             + clazz.isArray());
163         System.out.println("  isEnum: "
164             + clazz.isEnum());
165         System.out.println("  isInterface: "
166             + clazz.isInterface());
167         System.out.println("  isLocalClass: "
168             + clazz.isLocalClass());
169         System.out.println("  isMemberClass: "
170             + clazz.isMemberClass());
171         System.out.println("  isPrimitive: "
172             + clazz.isPrimitive());
173         System.out.println("  isSynthetic: "
174             + clazz.isSynthetic());
175 
176         if (WORKING) System.out.println("  genericInterfaces: "
177             + stringifyTypeArray(clazz.getGenericInterfaces()));
178     }
179 
180     /*
181      * Convert an array of Type into a string.  Start with an array count.
182      */
stringifyTypeArray(Type[] types)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 }
202