TestAnnotations.java revision fbdcfb9ea9e2a78f295834424c3f24986ea45dac
1package android.test.anno;
2
3import java.lang.annotation.Annotation;
4import java.lang.reflect.Constructor;
5import java.lang.reflect.Field;
6import java.lang.reflect.Method;
7import java.util.TreeMap;
8
9public class TestAnnotations {
10    /**
11     * Print the annotations in sorted order, so as to avoid
12     * any (legitimate) non-determinism with regard to the iteration order.
13     */
14    static private void printAnnotationArray(String prefix, Annotation[] arr) {
15        TreeMap<String, Annotation> sorted =
16            new TreeMap<String, Annotation>();
17
18        for (Annotation a : arr) {
19            sorted.put(a.annotationType().getName(), a);
20        }
21
22        for (Annotation a : sorted.values()) {
23            System.out.println(prefix + "  " + a);
24            System.out.println(prefix + "    " + a.annotationType());
25        }
26    }
27
28    static void printAnnotations(Class clazz) {
29        Annotation[] annos;
30        Annotation[][] parAnnos;
31
32        annos = clazz.getAnnotations();
33        System.out.println("annotations on TYPE " + clazz +
34            "(" + annos.length + "):");
35        printAnnotationArray("", annos);
36        System.out.println();
37
38        for (Constructor c: clazz.getDeclaredConstructors()) {
39            annos = c.getDeclaredAnnotations();
40            System.out.println("  annotations on CTOR " + c + ":");
41            printAnnotationArray("  ", annos);
42
43            System.out.println("    constructor parameter annotations:");
44            for (Annotation[] pannos: c.getParameterAnnotations()) {
45                printAnnotationArray("    ", pannos);
46            }
47        }
48
49        for (Method m: clazz.getDeclaredMethods()) {
50            annos = m.getDeclaredAnnotations();
51            System.out.println("  annotations on METH " + m + ":");
52            printAnnotationArray("  ", annos);
53
54            System.out.println("    method parameter annotations:");
55            for (Annotation[] pannos: m.getParameterAnnotations()) {
56                printAnnotationArray("    ", pannos);
57            }
58        }
59
60        for (Field f: clazz.getDeclaredFields()) {
61            annos = f.getDeclaredAnnotations();
62            System.out.println("  annotations on FIELD " + f + ":");
63            printAnnotationArray("  ", annos);
64
65            AnnoFancyField aff;
66            aff = (AnnoFancyField) f.getAnnotation(AnnoFancyField.class);
67            if (aff != null) {
68                System.out.println("    aff: " + aff + " / " + aff.getClass());
69                System.out.println("    --> nombre is '" + aff.nombre() + "'");
70            }
71        }
72        System.out.println();
73    }
74
75
76    @ExportedProperty(mapping = {
77        @IntToString(from = 0, to = "NORMAL_FOCUS"),
78        @IntToString(from = 2, to = "WEAK_FOCUS")
79    })
80    public int getFocusType() {
81        return 2;
82    }
83
84
85    @AnnoArrayField
86    String thing1;
87
88    @AnnoArrayField(
89            zz = {true,false,true},
90            bb = {-1,0,1},
91            cc = {'Q'},
92            ss = {12,13,14,15,16,17},
93            ii = {1,2,3,4},
94            ff = {1.1f,1.2f,1.3f},
95            jj = {-5,0,5},
96            dd = {0.3,0.6,0.9},
97            str = {"hickory","dickory","dock"}
98            )
99    String thing2;
100
101    public static void testArrays() {
102        TestAnnotations ta = new TestAnnotations();
103        Field field;
104        Annotation[] annotations;
105
106        try {
107            field = TestAnnotations.class.getDeclaredField("thing1");
108            annotations = field.getAnnotations();
109            System.out.println(field + ": " + annotations[0].toString());
110
111            field = TestAnnotations.class.getDeclaredField("thing2");
112            annotations = field.getAnnotations();
113            System.out.println(field + ": " + annotations[0].toString());
114        } catch (NoSuchFieldException nsfe) {
115            throw new RuntimeException(nsfe);
116        }
117    }
118
119    public static void testArrayProblem() {
120        Method meth;
121        ExportedProperty property;
122        final IntToString[] mapping;
123
124        try {
125            meth = TestAnnotations.class.getMethod("getFocusType",
126                    (Class[])null);
127        } catch (NoSuchMethodException nsme) {
128            throw new RuntimeException(nsme);
129        }
130        property = meth.getAnnotation(ExportedProperty.class);
131        mapping = property.mapping();
132
133        System.out.println("mapping is " + mapping.getClass() +
134            "\n  0='" + mapping[0] + "'\n  1='" + mapping[1] + "'");
135
136        /* while we're here, check isAnnotationPresent on Method */
137        System.out.println("present(getFocusType, ExportedProperty): " +
138            meth.isAnnotationPresent(ExportedProperty.class));
139        System.out.println("present(getFocusType, AnnoSimpleType): " +
140            meth.isAnnotationPresent(AnnoSimpleType.class));
141
142        System.out.println("");
143    }
144
145
146
147    public static void main(String[] args) {
148        System.out.println("TestAnnotations...");
149
150        testArrays();
151        testArrayProblem();
152        //System.exit(0);
153
154        System.out.println(
155            "AnnoSimpleField " + AnnoSimpleField.class.isAnnotation() +
156            ", SimplyNoted " + SimplyNoted.class.isAnnotation());
157
158        Class clazz;
159        clazz = SimplyNoted.class;
160        printAnnotations(clazz);
161        clazz = INoted.class;
162        printAnnotations(clazz);
163        clazz = SubNoted.class;
164        printAnnotations(clazz);
165        clazz = FullyNoted.class;
166        printAnnotations(clazz);
167
168        Annotation anno;
169
170        // this is expected to be non-null
171        anno = SimplyNoted.class.getAnnotation(AnnoSimpleType.class);
172        System.out.println("SimplyNoted.get(AnnoSimpleType) = " + anno);
173        // this is non-null if the @Inherited tag is present
174        anno = SubNoted.class.getAnnotation(AnnoSimpleType.class);
175        System.out.println("SubNoted.get(AnnoSimpleType) = " + anno);
176    }
177}
178
179