是否可以通过标识(即==)比较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