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

Dan*_*kov 6 java reflection jvm

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

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

xMethod != defaultM
xMethod.equals(defaultM)
Run Code Online (Sandbox Code Playgroud)

Hol*_*ger 5

不幸的是,Method对象不是不可变的.从Java 2开始,Method扩展AccessibleObject,其中有setAccessible(boolean)方法.

因此,方法不仅具有可变属性,而且该标志具有安全性影响,不允许共享Method对象.

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