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

标签 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)

最佳答案

不幸的是,Method 对象不是不可变的。从 Java 2 开始,Method 扩展了 AccessibleObject,后者具有 setAccessible(boolean)方法。

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

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

关于java - 为什么方法对象的多个实例用于继承的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37878071/

相关文章:

java - 获取 Java 进程分配的总内存(没有分析器)?

java - scala重写静态java方法

java - 如何在 OpenJDK 中禁用自旋锁同步

java - logcat-column '_id' 中的 JSON 到数据库创建错误不存在

java - JTextArea getColumns、getRows 返回 0

Java native 内存使用

c# - 为什么 Reflection 的 SetValue 会抛出异常?

c# - 我可以在运行时为 OrderBy 实例化一个 IComparer 类,而不考虑类型吗?

java - G1算法中的 memset 有什么用?

kotlin - 如何强制立即实例化枚举值?