-
Bug
-
Resolution: Fixed
-
P4
-
1.4.0
-
mantis
-
generic
-
generic
-
Verified
Name: erR10175 Date: 07/08/2002
New JCK testcases
api/java_lang/Class/index.html#Reflect2[Class2203]
api/java_lang/Class/index.html#Reflect2[Class2230]
fail with the following error messages:
Class2203: Failed. getDeclaredMethod returns wrong method public java.lang.Throwable
javasoft.sqe.tests.api.java.lang.Class.Overloader.m1(java.lang.Object)
Class2230: Failed. getMethod returns wrong method public java.lang.Throwable
javasoft.sqe.tests.api.java.lang.Class.Overloader.m1(java.lang.Object)
because java.lang.Class's methods (getDeclaredMethod and getMethod respectively) do
not choose from the set of methods with the same parameter types a method with the
most specific return type. In the tests the Overloader (see below) class is used to
get its method "m1(java.lang.Object)". The class has three methods with the signature.
They differ in return types, which are Object, Throwable and Exception. Both
getDeclaredMethod and getMethod choose the method that returns Throwable.
The specification of the methods reads:
"If more than one method with the same parameter types is declared in a class, and one
of these methods has a return type that is more specific than any of the others, that
method is returned;"
and "If C declares exactly one public method with the specified name and exactly the
same formal parameter types, that is the method reflected. If more than one such method
is found in C, and one of these methods has a return type that is more specific than any
of the others, that method is reflected;"
To reproduce the first failure put Overloader.class file (see attachment) to the current
directory then compile and run Class2203.java (see below) as the following log shows:
$ls && java -version && javac Class2203.java && java Class2203; echo $?
Class2203.java Overloader.class
java version "1.4.1-rc"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1-rc-b15)
Java HotSpot(TM) Client VM (build 1.4.1-rc-b15, mixed mode)
getDeclaredMethod returns wrong method public java.lang.Throwable Overloader.m1(java.lang.Object)
1
----------------------- Overloader.jasm (the source of Overloader.class)
/*
* this class has three methods named "m1"
* with the same parameter types, their return types are
* Object, Throwable and Exception.
*/
class Overloader
{
public Method m1:"(Ljava/lang/Throwable;)Ljava/lang/Throwable;"
stack 1 locals 2
{
aconst_null;
areturn;
}
public Method m1:"(Ljava/lang/Object;)Ljava/lang/Throwable;"
stack 1 locals 2
{
aconst_null;
areturn;
}
public Method m1:"(Ljava/lang/Object;)Ljava/lang/Object;"
stack 1 locals 2
{
aconst_null;
areturn;
}
public Method m1:"(Ljava/lang/Object;)Ljava/lang/Exception;"
stack 1 locals 2
{
aconst_null;
areturn;
}
} // end Class Overloader
---------------------------------------
----------------------- Class2203.java
import java.lang.reflect.Method;
class Class2203 {
public static void exit(int retCode, String msg) {
System.out.println(msg);
System.exit(retCode);
}
public static void main(String[] args) {
try {
Class arg[] = {Object.class};
Method m1 = Overloader.class.getDeclaredMethod("m1", arg);
if ( !m1.toString().equals("public java.lang.Exception Overloader.m1(java.lang.Object)" )) {
exit(1, "getDeclaredMethod returns wrong method " + m1);
}
exit(0, "OKAY");
} catch (SecurityException se){
exit(1, "" + se);
} catch (NoSuchMethodException e) {
exit(1, "Unexpected NoSuchMethodException");
}
}
}
--------------------------------------
======================================================================
- relates to
-
JDK-4714619 (reflect) Class.getMethods does not return all methods
-
- Closed
-