Non-existing method query yield proper exception
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 08 Jan 2013 16:32:11 +0100
changeset 4203497ecd097df
parent 419 73479ebdcf5d
child 421 0236ad6ab4d2
child 460 c0f1788183dd
Non-existing method query yield proper exception
emul/src/main/java/java/lang/Class.java
emul/src/main/java/java/lang/reflect/Method.java
emul/src/main/java/org/apidesign/bck2brwsr/emul/MethodImpl.java
vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java
     1.1 --- a/emul/src/main/java/java/lang/Class.java	Tue Jan 08 16:26:36 2013 +0100
     1.2 +++ b/emul/src/main/java/java/lang/Class.java	Tue Jan 08 16:32:11 2013 +0100
     1.3 @@ -788,10 +788,18 @@
     1.4       * @since JDK1.1
     1.5       */
     1.6      public Method getMethod(String name, Class<?>... parameterTypes)
     1.7 -        throws SecurityException {
     1.8 +        throws SecurityException, NoSuchMethodException {
     1.9          Method m = MethodImpl.findMethod(this, name, parameterTypes);
    1.10          if (m == null) {
    1.11 -            throw new SecurityException(); // XXX: NoSuchMethodException
    1.12 +            StringBuilder sb = new StringBuilder();
    1.13 +            sb.append(getName()).append('.').append(name).append('(');
    1.14 +            String sep = "";
    1.15 +            for (int i = 0; i < parameterTypes.length; i++) {
    1.16 +                sb.append(sep).append(parameterTypes[i].getName());
    1.17 +                sep = ", ";
    1.18 +            }
    1.19 +            sb.append(')');
    1.20 +            throw new NoSuchMethodException(sb.toString());
    1.21          }
    1.22          return m;
    1.23      }
     2.1 --- a/emul/src/main/java/java/lang/reflect/Method.java	Tue Jan 08 16:26:36 2013 +0100
     2.2 +++ b/emul/src/main/java/java/lang/reflect/Method.java	Tue Jan 08 16:32:11 2013 +0100
     2.3 @@ -320,14 +320,14 @@
     2.4              sb.append(Field.getTypeName(getReturnType())).append(' ');
     2.5              sb.append(Field.getTypeName(getDeclaringClass())).append('.');
     2.6              sb.append(getName()).append('(');
     2.7 -            /*
     2.8 -            Class<?>[] params = parameterTypes; // avoid clone
     2.9 +            Class<?>[] params = getParameterTypes(); // avoid clone
    2.10              for (int j = 0; j < params.length; j++) {
    2.11                  sb.append(Field.getTypeName(params[j]));
    2.12                  if (j < (params.length - 1))
    2.13                      sb.append(',');
    2.14              }
    2.15              sb.append(')');
    2.16 +            /*
    2.17              Class<?>[] exceptions = exceptionTypes; // avoid clone
    2.18              if (exceptions.length > 0) {
    2.19                  sb.append(" throws ");
     3.1 --- a/emul/src/main/java/org/apidesign/bck2brwsr/emul/MethodImpl.java	Tue Jan 08 16:26:36 2013 +0100
     3.2 +++ b/emul/src/main/java/org/apidesign/bck2brwsr/emul/MethodImpl.java	Tue Jan 08 16:32:11 2013 +0100
     3.3 @@ -66,11 +66,21 @@
     3.4      public static Method findMethod(
     3.5          Class<?> clazz, String name, Class<?>... parameterTypes) {
     3.6          Object[] data = findMethodData(clazz, name + "__");
     3.7 -        if (data.length == 0) {
     3.8 -            return null;
     3.9 +        BIG: for (int i = 0; i < data.length; i += 2) {
    3.10 +            String sig = ((String) data[0]).substring(name.length() + 2);
    3.11 +            Method tmp = INSTANCE.create(clazz, name, data[1], sig);
    3.12 +            Class<?>[] tmpParms = tmp.getParameterTypes();
    3.13 +            if (parameterTypes.length != tmpParms.length) {
    3.14 +                continue;
    3.15 +            }
    3.16 +            for (int j = 0; j < tmpParms.length; j++) {
    3.17 +                if (!parameterTypes[j].equals(tmpParms[j])) {
    3.18 +                    continue BIG;
    3.19 +                }
    3.20 +            }
    3.21 +            return tmp;
    3.22          }
    3.23 -        String sig = ((String) data[0]).substring(name.length() + 2);
    3.24 -        return INSTANCE.create(clazz, name, data[1], sig);
    3.25 +        return null;
    3.26      }
    3.27  
    3.28      public static Method[] findMethods(Class<?> clazz, int mask) {
     4.1 --- a/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java	Tue Jan 08 16:26:36 2013 +0100
     4.2 +++ b/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java	Tue Jan 08 16:32:11 2013 +0100
     4.3 @@ -82,6 +82,9 @@
     4.4          final Class[] pt = plus.getParameterTypes();
     4.5          return pt[0].getName();
     4.6      }
     4.7 +    @Compare public String paramTypesNotFound() throws Exception {
     4.8 +        return StaticUse.class.getMethod("plus", int.class, double.class).toString();
     4.9 +    }
    4.10      @Compare public int methodWithArgs() throws Exception {
    4.11          Method plus = StaticUse.class.getMethod("plus", int.class, Integer.TYPE);
    4.12          return (Integer)plus.invoke(null, 2, 3);