Java 方法对象可以通过身份进行比较(即 ==)还是我必须使用 equals()?
Can the Java Method object be compared by identity (ie. ==) or do I have to use equals()?
在 Java 中,java.lang.reflect.Method
对象的实例可以通过身份进行比较(即 ==)还是必须使用 equals()?
问题不是指==
和equals
之间的一般区别,而是特别指java.lang.reflect.Method
个实例。
这是一个合理的问题,因为可以合理地假设每个 Method
对象只存在 一个实例 - 类似于 Class
对象,在 JVM 中只创建了 一次。
然而,情况并非如此:两个 Method
对象可能是 equal
,即使它们并不 相同 ,如在这个例子(它也对 Class
对象进行比较,以强调这些确实 是 相同的)
package Whosebug;
import java.lang.reflect.Method;
public class MethodEquals
{
public static void main(String[] args) throws Exception
{
checkMethods();
checkClasses();
}
static void checkMethods() throws Exception
{
Method m0 = MethodEquals.class.getMethod("exampleMethod", int.class);
Method m1 = MethodEquals.class.getMethod("exampleMethod", int.class);
boolean identical = (m0 == m1);
boolean equal = m0.equals(m1);
System.out.println("Methods: "+(identical == equal)); // prints "false"
}
static void checkClasses() throws Exception
{
Class<?> c0 = Class.forName("Whosebug.MethodEquals");
Class<?> c1 = Class.forName("Whosebug.MethodEquals");
boolean identical = (c0 == c1);
boolean equal = c0.equals(c1);
System.out.println("Classes: "+(identical == equal)); // prints "true"
}
public float exampleMethod(int i)
{
return 42.0f;
}
}
在 Java 中,java.lang.reflect.Method
对象的实例可以通过身份进行比较(即 ==)还是必须使用 equals()?
问题不是指==
和equals
之间的一般区别,而是特别指java.lang.reflect.Method
个实例。
这是一个合理的问题,因为可以合理地假设每个 Method
对象只存在 一个实例 - 类似于 Class
对象,在 JVM 中只创建了 一次。
然而,情况并非如此:两个 Method
对象可能是 equal
,即使它们并不 相同 ,如在这个例子(它也对 Class
对象进行比较,以强调这些确实 是 相同的)
package Whosebug;
import java.lang.reflect.Method;
public class MethodEquals
{
public static void main(String[] args) throws Exception
{
checkMethods();
checkClasses();
}
static void checkMethods() throws Exception
{
Method m0 = MethodEquals.class.getMethod("exampleMethod", int.class);
Method m1 = MethodEquals.class.getMethod("exampleMethod", int.class);
boolean identical = (m0 == m1);
boolean equal = m0.equals(m1);
System.out.println("Methods: "+(identical == equal)); // prints "false"
}
static void checkClasses() throws Exception
{
Class<?> c0 = Class.forName("Whosebug.MethodEquals");
Class<?> c1 = Class.forName("Whosebug.MethodEquals");
boolean identical = (c0 == c1);
boolean equal = c0.equals(c1);
System.out.println("Classes: "+(identical == equal)); // prints "true"
}
public float exampleMethod(int i)
{
return 42.0f;
}
}