ClassAttrs.java revision aec9c8f142ad839883ae3de7383456a08823a282
1import 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;
9import java.lang.reflect.TypeVariable;
10
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
46        /* fancy */
47        printClassAttrs(FancyClass.class);
48
49        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 {
79            if (obj instanceof AccessibleObject) {
80                method = AccessibleObject.class.getDeclaredMethod(
81                        "getSignatureAttribute");
82            } else {
83                // Should be a Class.
84                method = Class.class.getDeclaredMethod(
85                        "getSignatureAttribute");
86            }
87            method.setAccessible(true);
88        } catch (NoSuchMethodException ex) {
89            //System.err.println("getSignatureAttribute() not defined.");
90            //ex.printStackTrace();
91            return "<unknown>";
92        }
93
94        try {
95            return (String) method.invoke(obj);
96        } catch (IllegalAccessException ex) {
97            throw new RuntimeException(ex);
98        } catch (InvocationTargetException ex) {
99            throw new RuntimeException(ex);
100        }
101    }
102
103    /* for reflection testing */
104    static class MemberClass<XYZ> {
105        public MemberClass<XYZ> mWha;
106
107        public MemberClass(MemberClass<XYZ> memb) {
108            mWha = memb;
109        }
110
111        public Class<XYZ> foo() throws NoSuchMethodException {
112            return null;
113        }
114    }
115
116    /* for reflection testing (getClasses vs getDeclaredClasses) */
117    static public class PublicMemberClass {
118        float mBlah;
119    }
120
121    /*
122     * Dump a variety of class attributes.
123     */
124    public static void printClassAttrs(Class clazz) {
125        Class clazz2;
126
127        System.out.println("***** " + clazz + ":");
128
129        System.out.println("  name: "
130            + clazz.getName());
131        System.out.println("  canonical: "
132            + clazz.getCanonicalName());
133        System.out.println("  simple: "
134            + clazz.getSimpleName());
135        System.out.println("  genericSignature: "
136            + getSignatureAttribute(clazz));
137
138        System.out.println("  super: "
139            + clazz.getSuperclass());
140        System.out.println("  genericSuperclass: "
141            + clazz.getGenericSuperclass());
142        System.out.println("  declaring: "
143            + clazz.getDeclaringClass());
144        System.out.println("  enclosing: "
145            + clazz.getEnclosingClass());
146        System.out.println("  enclosingCon: "
147            + clazz.getEnclosingConstructor());
148        System.out.println("  enclosingMeth: "
149            + clazz.getEnclosingMethod());
150        System.out.println("  modifiers: "
151            + clazz.getModifiers());
152        System.out.println("  package: "
153            + clazz.getPackage());
154
155        System.out.println("  declaredClasses: "
156            + stringifyTypeArray(clazz.getDeclaredClasses()));
157        System.out.println("  member classes: "
158            + stringifyTypeArray(clazz.getClasses()));
159
160        System.out.println("  isAnnotation: "
161            + clazz.isAnnotation());
162        System.out.println("  isAnonymous: "
163            + clazz.isAnonymousClass());
164        System.out.println("  isArray: "
165            + clazz.isArray());
166        System.out.println("  isEnum: "
167            + clazz.isEnum());
168        System.out.println("  isInterface: "
169            + clazz.isInterface());
170        System.out.println("  isLocalClass: "
171            + clazz.isLocalClass());
172        System.out.println("  isMemberClass: "
173            + clazz.isMemberClass());
174        System.out.println("  isPrimitive: "
175            + clazz.isPrimitive());
176        System.out.println("  isSynthetic: "
177            + clazz.isSynthetic());
178
179        System.out.println("  genericInterfaces: "
180            + stringifyTypeArray(clazz.getGenericInterfaces()));
181
182        TypeVariable<Class<?>>[] typeParameters = clazz.getTypeParameters();
183        System.out.println("  typeParameters: "
184            + stringifyTypeArray(typeParameters));
185    }
186
187    /*
188     * Convert an array of Type into a string.  Start with an array count.
189     */
190    private static String stringifyTypeArray(Type[] types) {
191        StringBuilder stb = new StringBuilder();
192        boolean first = true;
193
194        stb.append("[" + types.length + "]");
195
196        for (Type t: types) {
197            if (first) {
198                stb.append(" ");
199                first = false;
200            } else {
201                stb.append(", ");
202            }
203            stb.append(t.toString());
204        }
205
206        return stb.toString();
207    }
208}
209