为什么Method对象的多个实例用于继承的方法

时间:2016-06-17 09:33:23

标签: java reflection jvm

我发现使用默认equals方法的类有所不同 元对象的实例方法。为什么会这样? 乍一看它看起来不是最佳的,因为方法对象是不可变的。

class X {}
Method defaultM = Object.class.getMethod("equals", Object.class)
Method xMethod =  X.class.getMethod("equals", Object.class)

xMethod != defaultM
xMethod.equals(defaultM)

3 个答案:

答案 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类重新实现。