Home | History | Annotate | Download | only in src
      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 {
     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