1.1 --- a/rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionAnnotationTest.java Sun Mar 20 08:12:55 2016 +0100
1.2 +++ b/rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionAnnotationTest.java Sun Mar 20 09:05:43 2016 +0100
1.3 @@ -17,6 +17,7 @@
1.4 */
1.5 package org.apidesign.bck2brwsr.tck;
1.6
1.7 +import java.lang.annotation.Annotation;
1.8 import java.lang.annotation.Retention;
1.9 import java.lang.annotation.RetentionPolicy;
1.10 import org.apidesign.bck2brwsr.vmtest.Compare;
1.11 @@ -49,6 +50,10 @@
1.12 @Ann
1.13 @AnnAnn
1.14 class D {
1.15 + @Ann
1.16 + @AnnAnn
1.17 + public void method() {
1.18 + }
1.19 }
1.20
1.21 @Ann(type = String.class)
1.22 @@ -109,6 +114,58 @@
1.23 // return ann.string();
1.24 // }
1.25
1.26 + private static String toClassNames(Object[] arr) {
1.27 + StringBuilder sb = new StringBuilder();
1.28 + sb.append("\n");
1.29 + for (Object o : arr) {
1.30 + if (o == null) {
1.31 + sb.append("null");
1.32 + } else if (o instanceof Ann) {
1.33 + sb.append("Ann");
1.34 + } else if (o instanceof AnnAnn) {
1.35 + sb.append("AnnAnn");
1.36 + }
1.37 + sb.append("\n");
1.38 + }
1.39 + return sb.toString();
1.40 + }
1.41 +
1.42 + @Compare
1.43 + public String twoAnnotations() {
1.44 + Annotation[] arr = D.class.getAnnotations();
1.45 + if (arr == null) {
1.46 + return "Null array";
1.47 + }
1.48 + return toClassNames(arr);
1.49 + }
1.50 +
1.51 + @Compare
1.52 + public String twoDeclaredAnnotations() {
1.53 + Annotation[] arr = D.class.getDeclaredAnnotations();
1.54 + if (arr == null) {
1.55 + return "Null array";
1.56 + }
1.57 + return toClassNames(arr);
1.58 + }
1.59 +
1.60 + @Compare
1.61 + public String twoAnnotationsOnMethod() throws Exception {
1.62 + Annotation[] arr = D.class.getMethod("method").getAnnotations();
1.63 + if (arr == null) {
1.64 + return "Null array";
1.65 + }
1.66 + return toClassNames(arr);
1.67 + }
1.68 +
1.69 + @Compare
1.70 + public String twoDeclaredAnnotationsOnMethod() throws Exception {
1.71 + Annotation[] arr = D.class.getMethod("method").getAnnotations();
1.72 + if (arr == null) {
1.73 + return "Null array";
1.74 + }
1.75 + return toClassNames(arr);
1.76 + }
1.77 +
1.78 @Factory
1.79 public static Object[] create() {
1.80 return VMTest.create(ReflectionAnnotationTest.class);
2.1 --- a/rt/emul/mini/src/main/java/java/lang/Class.java Sun Mar 20 08:12:55 2016 +0100
2.2 +++ b/rt/emul/mini/src/main/java/java/lang/Class.java Sun Mar 20 09:05:43 2016 +0100
2.3 @@ -1788,7 +1788,7 @@
2.4 * @since 1.5
2.5 */
2.6 public Annotation[] getDeclaredAnnotations() {
2.7 - throw new UnsupportedOperationException();
2.8 + return getAnnotations();
2.9 }
2.10
2.11 @JavaScriptBody(args = "type", body = ""
3.1 --- a/rt/emul/mini/src/main/java/java/lang/reflect/Method.java Sun Mar 20 08:12:55 2016 +0100
3.2 +++ b/rt/emul/mini/src/main/java/java/lang/reflect/Method.java Sun Mar 20 09:05:43 2016 +0100
3.3 @@ -672,9 +672,20 @@
3.4 + " return a['L' + ac.jvmName + ';'];"
3.5 + "} else return null;"
3.6 )
3.7 - private Object getAnnotationData(Class<?> annotationClass) {
3.8 - throw new UnsupportedOperationException();
3.9 - }
3.10 + private native Object getAnnotationData(Class<?> annotationClass);
3.11 +
3.12 + @JavaScriptBody(args = {},
3.13 + body =
3.14 + "var a = this._data().anno;\n"
3.15 + + "if (a) {\n"
3.16 + + " var arr = [];\n"
3.17 + + " for (p in a) {\n"
3.18 + + " arr.push(p);\n"
3.19 + + " }\n"
3.20 + + " return arr;\n"
3.21 + + "} else return [];\n"
3.22 + )
3.23 + private native String[] getAnnotationNames();
3.24
3.25 /**
3.26 * @throws NullPointerException {@inheritDoc}
3.27 @@ -689,7 +700,19 @@
3.28 * @since 1.5
3.29 */
3.30 public Annotation[] getDeclaredAnnotations() {
3.31 - throw new UnsupportedOperationException();
3.32 + String[] arr = getAnnotationNames();
3.33 + Annotation[] res = new Annotation[arr.length];
3.34 + for (int i = 0; i < arr.length; i++) {
3.35 + String forName = arr[i].substring(1, arr[i].length() - 1).replace('/', '.');
3.36 + final Class<? extends Annotation> annoType;
3.37 + try {
3.38 + annoType = Class.forName(forName).asSubclass(Annotation.class);
3.39 + } catch (ClassNotFoundException ex) {
3.40 + throw new IllegalStateException(forName);
3.41 + }
3.42 + res[i] = getAnnotation(annoType);
3.43 + }
3.44 + return res;
3.45 }
3.46
3.47 /**