emul/src/main/java/java/lang/reflect/Method.java
branchreflection
changeset 264 ed0c92c81ea4
parent 262 683719ffcfe7
child 266 2e2e6f946208
     1.1 --- a/emul/src/main/java/java/lang/reflect/Method.java	Tue Dec 04 15:32:18 2012 +0100
     1.2 +++ b/emul/src/main/java/java/lang/reflect/Method.java	Wed Dec 05 09:28:31 2012 +0100
     1.3 @@ -54,6 +54,7 @@
     1.4      private final Class<?> clazz;
     1.5      private final String name;
     1.6      private final Object data;
     1.7 +    private final String sig;
     1.8      private int modifiers;
     1.9  
    1.10     // Generics infrastructure
    1.11 @@ -65,12 +66,12 @@
    1.12       * instantiation of these objects in Java code from the java.lang
    1.13       * package via sun.reflect.LangReflectAccess.
    1.14       */
    1.15 -    Method(Class<?> declaringClass,
    1.16 -           String name, Object data)
    1.17 +    Method(Class<?> declaringClass, String name, Object data, String sig)
    1.18      {
    1.19          this.clazz = declaringClass;
    1.20          this.name = name;
    1.21          this.data = data;
    1.22 +        this.sig = sig;
    1.23      }
    1.24  
    1.25      /**
    1.26 @@ -594,29 +595,52 @@
    1.27      // bck2brwsr implementation
    1.28      //
    1.29  
    1.30 -    @JavaScriptBody(args = { "clazz", "name", "params" },
    1.31 -        body = "if (params.length > 0) return null;\n"
    1.32 +    @JavaScriptBody(args = { "clazz", "prefix" },
    1.33 +        body = ""
    1.34          + "var c = clazz.cnstr.prototype;"
    1.35 -        + "var prefix = name + '__';\n"
    1.36 +        + "var arr = new Array();\n"
    1.37          + "for (m in c) {\n"
    1.38 -        + "  if (m.indexOf(prefix) === 0) {"
    1.39 -        + "     return c[m];\n"
    1.40 +        + "  if (m.indexOf(prefix) === 0) {\n"
    1.41 +        + "     arr.push(m);\n"
    1.42 +        + "     arr.push(c[m]);\n"
    1.43          + "  }"
    1.44          + "}\n"
    1.45 -        + "return null;"
    1.46 +        + "return arr;"
    1.47      )
    1.48 -    private static native Object findMethodData(
    1.49 -        Class<?> clazz, String name, Class<?>... parameterTypes
    1.50 +    private static native Object[] findMethodData(
    1.51 +        Class<?> clazz, String prefix
    1.52      );
    1.53 -    
    1.54 +
    1.55      // XXX should not be public
    1.56      public static Method findMethod(
    1.57          Class<?> clazz, String name, Class<?>... parameterTypes
    1.58      ) {
    1.59 -        Object data = findMethodData(clazz, name, parameterTypes);
    1.60 -        if (data == null) {
    1.61 +        Object[] data = findMethodData(clazz, name + "__");
    1.62 +        if (data.length == 0) {
    1.63              return null;
    1.64          }
    1.65 -        return new Method(clazz, name, data);
    1.66 +        String sig = ((String)data[0]).substring(name.length() + 2);
    1.67 +        return new Method(clazz, name, data[1], sig);
    1.68 +    }
    1.69 +    
    1.70 +    public static Method[] findMethods(Class<?> clazz) {
    1.71 +        Object[] namesAndData = findMethodData(clazz, "");
    1.72 +        int cnt = 0;
    1.73 +        for (int i = 0; i < namesAndData.length; i += 2) {
    1.74 +            String sig = (String) namesAndData[i];
    1.75 +            Object data = namesAndData[i + 1];
    1.76 +            int middle = sig.indexOf("__");
    1.77 +            if (middle == -1) {
    1.78 +                continue;
    1.79 +            }
    1.80 +            String name = sig.substring(0, middle);
    1.81 +            sig = sig.substring(middle + 2);
    1.82 +            namesAndData[cnt++] = new Method(clazz, name, data, sig);
    1.83 +        }
    1.84 +        Method[] arr = new Method[cnt];
    1.85 +        for (int i = 0; i < cnt; i++) {
    1.86 +            arr[i] = (Method)namesAndData[i];
    1.87 +        }
    1.88 +        return arr;
    1.89      }
    1.90  }