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

Why multiple instances of Method object are for the inherited methods

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

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

xMethod != defaultM
xMethod.equals(defaultM)

对象的 Equals 方法不是最终的,它应该由您的 X class.

重新实现

下面的代码打印 false 即使两个 Method 对象引用相同的 Method class:

Method m1 = A.class.getMethod("equals", Object.class);
Method m2 = A.class.getMethod("equals", Object.class);
System.out.println(m1 == m2);

因此,期望 Method 对象的单例行为指的是两个 不同 classes.

中的方法是无意义的

不幸的是,Method 对象不是 不可变的。由于 Java 2,Method 扩展了 AccessibleObject,它具有 setAccessible(boolean) 方法。

因此,不仅方法具有可变 属性,此标志还具有安全影响,不允许共享 Method 个对象。

请注意,在幕后,Method 对象确实通过委托对象共享它们共同的不可变状态,因此您从 Class.getMethod 获得的只是一个由可变对象组成的廉价前端对象标志和对共享规范方法表示的引用。