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);