Java Method 对象可以通过身份(即==)进行比较还是必须使用equals()?

JRA*_*TLL 4 java reflection equality comparison-operators

在 Java 中,java.lang.reflect.Method对象的实例可以通过身份(即 ==)进行比较还是必须使用 equals()?

Mar*_*o13 5

这个问题不是指==equals一般性之间的区别,而是具体指的是java.lang.reflect.Method实例。

这是一个合理的问题,因为假设每个实例只存在一个实例是合理的Method——类似于在 JVM 中Class只创建一次的对象。

然而,情况并非如此:两个Method对象可能是equal,即使它们不相同,如本示例中所示(它也对Class对象进行了比较,以强调它们确实相同的)

package stackoverflow;

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("stackoverflow.MethodEquals");
        Class<?> c1 = Class.forName("stackoverflow.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;
    }
}
Run Code Online (Sandbox Code Playgroud)