问题是:每个实例对象(包含了Filed对象和Method对象)中的方法对象是真实的方法对象还是对该方法对象的引用?
1
当一个类有多个实例对象时,那么这些对象中的方法对象指向的是同一个方法对象么?
指向的是方法区中的同一段地址空间么?那么这些不同实例对象中的相同的方法对象是相等的么?
本人测试结果:
jdk的api中重写了method对象的equals方法(该方法中认为只要方法签名相同,参数列表相同,返回值相同或者是同一对象是返回true);测试结果:同一个类的不同的实例对象的相同的方法即是相等的;(通过内容判断,是相等的)
但是使用==判断时,就不相等,此结果说明了不同的实例对象的同一个方法引用的对象不是同一个;同时也说明了一个类中的方法的实例对象不止一个(静态方法除外);
由测试结果初步认为,每一个实例对象都有自己的独自的方法对象,
想问一下,每一实例对象在自己的方法对象中保存了什么?好像除了对方法签名与方法区的方法地址做映射之外,什么也保存不了,(否则在多线程单例模式下会有线程危机),
所以既然这样,java设计之初为什么将对象中的方法对象的引用变量指向另一个对象,再指向方法区的地址??有必要绕一圈么?
个人以前以为,堆中的对象中的方法对象就是对方法区中方法的直接引用(即==的结果应该相等,即引用的是同一个地址),但现在看来,好像不是,貌似是通过方法对象在中间进行了过渡(准确说是插了一脚),但实在不了解他的存在价值,不知道是不是设计时存在其他考虑,或有其他用途?还是我上面的验证结果是错的?突然发现以前习以为常用着很简单的东西,只要一深想会发现都不简单!
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.4