我发现使用默认equals方法的类有所不同 元对象的实例方法。为什么会这样? 乍一看它看起来不是最佳的,因为方法对象是不可变的。
class X {}
Method defaultM = Object.class.getMethod("equals", Object.class)
Method xMethod = X.class.getMethod("equals", Object.class)
xMethod != defaultM
xMethod.equals(defaultM)
答案 0 :(得分:5)
不幸的是,Method
个对象不不可变。自Java 2起,Method
扩展AccessibleObject
,其中setAccessible(boolean)
方法。
因此,方法不仅具有可变属性,而且该标志具有安全性影响,不允许共享Method
个对象。
请注意,在引擎盖下,Method
对象通过委托对象共享它们的公共不可变状态,因此从Class.getMethod
得到的只是一个廉价的前端对象,由可变标志和对共享规范方法表示的引用。
答案 1 :(得分:2)
以下代码打印false
,即使是两个引用同一类相同 Method
的{{1}}个对象:
Method
因此,期望Method m1 = A.class.getMethod("equals", Object.class);
Method m2 = A.class.getMethod("equals", Object.class);
System.out.println(m1 == m2);
个对象的单例行为引用两个不同类中的方法是空闲的。
答案 2 :(得分:0)
对象的等于方法不是最终的,它应该由你的X类重新实现。