Can obtain values of inner annotation types reflection
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 04 Feb 2013 23:18:51 +0100
branchreflection
changeset 6627832188e26b8
parent 661 66e080030577
child 663 09225928b9fb
Can obtain values of inner annotation types
emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java
vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java
vm/src/test/java/org/apidesign/vm4brwsr/Classes.java
     1.1 --- a/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java	Mon Feb 04 23:06:43 2013 +0100
     1.2 +++ b/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java	Mon Feb 04 23:18:51 2013 +0100
     1.3 @@ -38,25 +38,32 @@
     1.4      }
     1.5  
     1.6      @JavaScriptBody(args = { "a", "n", "arr", "values" }, body = ""
     1.7 -        + "function f(v, p) {\n"
     1.8 +        + "function f(v, p, c) {\n"
     1.9          + "  var val = v;\n"
    1.10          + "  var prop = p;\n"
    1.11 +        + "  var clazz = c;\n"
    1.12          + "  return function() {\n"
    1.13 -        + "    return val[prop];\n"
    1.14 +        + "    if (clazz == null) return val[prop];\n"
    1.15 +        + "    return CLS.prototype.c__Ljava_lang_Object_2Ljava_lang_Class_2Ljava_lang_Object_2(clazz, val[prop]);\n"
    1.16          + "  };\n"
    1.17          + "}\n"
    1.18 -        + "for (var i = 0; i < arr.length; i += 2) {\n"
    1.19 +        + "for (var i = 0; i < arr.length; i += 3) {\n"
    1.20          + "  var m = arr[i];\n"
    1.21          + "  var p = arr[i + 1];\n"
    1.22 -        + "  a[m] = new f(values, p);\n"
    1.23 +        + "  var c = arr[i + 2];\n"
    1.24 +        + "  a[m] = new f(values, p, c);\n"
    1.25          + "}\n"
    1.26          + "a['$instOf_' + n] = true;\n"
    1.27          + "return a;"
    1.28      )
    1.29      private static native <T extends Annotation> T create(
    1.30 -        AnnotationImpl a, String n, String[] methodsAndProps, Object values
    1.31 +        AnnotationImpl a, String n, Object[] methodsAndProps, Object values
    1.32      );
    1.33      
    1.34 +    private static Object c(Class<? extends Annotation> a, Object v) {
    1.35 +        return create(a, v);
    1.36 +    }
    1.37 +    
    1.38      public static <T extends Annotation> T create(Class<T> annoClass, Object values) {
    1.39          return create(new AnnotationImpl(annoClass), 
    1.40              annoClass.getName().replace('.', '_'), 
    1.41 @@ -98,13 +105,14 @@
    1.42      @JavaScriptBody(args={ "anno", "p"}, body="return anno[p];")
    1.43      private static native Object findData(Object anno, String p);
    1.44  
    1.45 -    private static String[] findProps(Class<?> annoClass) {
    1.46 +    private static Object[] findProps(Class<?> annoClass) {
    1.47          final Method[] marr = MethodImpl.findMethods(annoClass, Modifier.PUBLIC);
    1.48 -        String[] arr = new String[marr.length * 2];
    1.49 +        Object[] arr = new Object[marr.length * 3];
    1.50          int pos = 0;
    1.51          for (Method m : marr) {
    1.52              arr[pos++] = MethodImpl.toSignature(m);
    1.53              arr[pos++] = m.getName();
    1.54 +            arr[pos++] = m.getReturnType().isAnnotation() ? m.getReturnType() : null;
    1.55          }
    1.56          return arr;
    1.57      }
     2.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java	Mon Feb 04 23:06:43 2013 +0100
     2.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java	Mon Feb 04 23:18:51 2013 +0100
     2.3 @@ -102,6 +102,9 @@
     2.4      @Test public void jsStringAnnotationFromArray() throws Exception {
     2.5          assertExec("Check class annotation", Classes.class, "getNamer__Ljava_lang_String_2Z", "my text", false);
     2.6      }
     2.7 +    @Test public void jsInnerAnnotation() throws Exception {
     2.8 +        assertExec("Check inner annotation", Classes.class, "getInnerNamer__I", Double.valueOf(Classes.getInnerNamer()));
     2.9 +    }
    2.10      @Test public void javaInvokeMethod() throws Exception {
    2.11          assertEquals(Classes.reflectiveMethodCall(true, "name"), "java.io.IOException", "Calls the name() method via reflection");
    2.12      }
     3.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java	Mon Feb 04 23:06:43 2013 +0100
     3.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java	Mon Feb 04 23:18:51 2013 +0100
     3.3 @@ -33,7 +33,7 @@
     3.4      @ClassesMarker.Anno(Integer.SIZE),
     3.5      @ClassesMarker.Anno(Integer.MIN_VALUE)
     3.6  })
     3.7 -@ClassesNamer(name = "my text", anno = @ClassesMarker.Anno(Integer.MAX_VALUE))
     3.8 +@ClassesNamer(name = "my text", anno = @ClassesMarker.Anno(333))
     3.9  public class Classes {
    3.10      public static String nameOfIO() {
    3.11          return nameFor(IOException.class);
    3.12 @@ -145,6 +145,11 @@
    3.13          }
    3.14          return null;
    3.15      }
    3.16 +    public static int getInnerNamer() {
    3.17 +        ClassesNamer cm = Classes.class.getAnnotation(ClassesNamer.class);
    3.18 +        assert cm != null : "ClassesNamer is present";
    3.19 +        return cm.anno().value();
    3.20 +    }
    3.21      
    3.22      public static String intType() {
    3.23          return Integer.TYPE.getName();