• 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 import java.lang.reflect.TypeVariable;
10 
11 public class ClassAttrs {
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 
main()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 */
getSignatureAttribute(Object obj)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 
MemberClass(MemberClass<XYZ> memb)107         public MemberClass(MemberClass<XYZ> memb) {
108             mWha = memb;
109         }
110 
foo()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      */
printClassAttrs(Class clazz)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      */
stringifyTypeArray(Type[] types)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