# HG changeset patch # User Jaroslav Tulach # Date 1357659131 -3600 # Node ID 3497ecd097df8cf58f402d8ce2ae0746ce18c5be # Parent 73479ebdcf5d6ff6745160035fe3f5ebaeed6bf1 Non-existing method query yield proper exception diff -r 73479ebdcf5d -r 3497ecd097df emul/src/main/java/java/lang/Class.java --- a/emul/src/main/java/java/lang/Class.java Tue Jan 08 16:26:36 2013 +0100 +++ b/emul/src/main/java/java/lang/Class.java Tue Jan 08 16:32:11 2013 +0100 @@ -788,10 +788,18 @@ * @since JDK1.1 */ public Method getMethod(String name, Class... parameterTypes) - throws SecurityException { + throws SecurityException, NoSuchMethodException { Method m = MethodImpl.findMethod(this, name, parameterTypes); if (m == null) { - throw new SecurityException(); // XXX: NoSuchMethodException + StringBuilder sb = new StringBuilder(); + sb.append(getName()).append('.').append(name).append('('); + String sep = ""; + for (int i = 0; i < parameterTypes.length; i++) { + sb.append(sep).append(parameterTypes[i].getName()); + sep = ", "; + } + sb.append(')'); + throw new NoSuchMethodException(sb.toString()); } return m; } diff -r 73479ebdcf5d -r 3497ecd097df emul/src/main/java/java/lang/reflect/Method.java --- a/emul/src/main/java/java/lang/reflect/Method.java Tue Jan 08 16:26:36 2013 +0100 +++ b/emul/src/main/java/java/lang/reflect/Method.java Tue Jan 08 16:32:11 2013 +0100 @@ -320,14 +320,14 @@ sb.append(Field.getTypeName(getReturnType())).append(' '); sb.append(Field.getTypeName(getDeclaringClass())).append('.'); sb.append(getName()).append('('); - /* - Class[] params = parameterTypes; // avoid clone + Class[] params = getParameterTypes(); // avoid clone for (int j = 0; j < params.length; j++) { sb.append(Field.getTypeName(params[j])); if (j < (params.length - 1)) sb.append(','); } sb.append(')'); + /* Class[] exceptions = exceptionTypes; // avoid clone if (exceptions.length > 0) { sb.append(" throws "); diff -r 73479ebdcf5d -r 3497ecd097df emul/src/main/java/org/apidesign/bck2brwsr/emul/MethodImpl.java --- a/emul/src/main/java/org/apidesign/bck2brwsr/emul/MethodImpl.java Tue Jan 08 16:26:36 2013 +0100 +++ b/emul/src/main/java/org/apidesign/bck2brwsr/emul/MethodImpl.java Tue Jan 08 16:32:11 2013 +0100 @@ -66,11 +66,21 @@ public static Method findMethod( Class clazz, String name, Class... parameterTypes) { Object[] data = findMethodData(clazz, name + "__"); - if (data.length == 0) { - return null; + BIG: for (int i = 0; i < data.length; i += 2) { + String sig = ((String) data[0]).substring(name.length() + 2); + Method tmp = INSTANCE.create(clazz, name, data[1], sig); + Class[] tmpParms = tmp.getParameterTypes(); + if (parameterTypes.length != tmpParms.length) { + continue; + } + for (int j = 0; j < tmpParms.length; j++) { + if (!parameterTypes[j].equals(tmpParms[j])) { + continue BIG; + } + } + return tmp; } - String sig = ((String) data[0]).substring(name.length() + 2); - return INSTANCE.create(clazz, name, data[1], sig); + return null; } public static Method[] findMethods(Class clazz, int mask) { diff -r 73479ebdcf5d -r 3497ecd097df vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java --- a/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java Tue Jan 08 16:26:36 2013 +0100 +++ b/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java Tue Jan 08 16:32:11 2013 +0100 @@ -82,6 +82,9 @@ final Class[] pt = plus.getParameterTypes(); return pt[0].getName(); } + @Compare public String paramTypesNotFound() throws Exception { + return StaticUse.class.getMethod("plus", int.class, double.class).toString(); + } @Compare public int methodWithArgs() throws Exception { Method plus = StaticUse.class.getMethod("plus", int.class, Integer.TYPE); return (Integer)plus.invoke(null, 2, 3);