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)
不幸的是,Method对象不是不可变的.从Java 2开始,Method扩展AccessibleObject,其中有setAccessible(boolean)方法.
因此,方法不仅具有可变属性,而且该标志具有安全性影响,不允许共享Method对象.
请注意,在引擎盖下,Method对象确实通过委托对象共享它们的公共不可变状态,因此您获得Class.getMethod的只是一个廉价的前端对象,由可变标志和对共享规范方法表示的引用组成.