编程语言
首页 > 编程语言> > 是否可以通过标识(即==)比较Java方法对象,还是必须使用equals()?

是否可以通过标识(即==)比较Java方法对象,还是必须使用equals()?

作者:互联网

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

解决方法:

这个问题通常不涉及==和equals之间的区别,而是特别涉及java.lang.reflect.Method实例.

这是一个合理的问题,因为可以合理地假设每个Method仅存在一个实例-与Class对象类似,它们在JVM中仅创建一次.

但是,情况并非如此:两个Method对象可能相等,即使它们不相同,如在本示例中可以看到的(它也对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;
    }
}

标签:comparison-operators,reflection,equality,java
来源: https://codeday.me/bug/20191028/1954427.html