`

JAVA对象怎样实现对一个方法的调用的?

阅读更多
举个例子:
  public class Example{
     public static void main(String[] args){
         //Bean 对象
         Bean b = new Bean();
         b.way();
     }   
  }
class Bean{
    private int num =0;
    public Bean(){
      this.num = 5;
    }
    public void way(){}
}

这里把JVM当做一个实例对象
JVM j = new JVM();
首先,JAVA虚拟机在执行一个主程序Main方法之前,先创建一个虚拟机的实例,在虚拟机创建实例就拥有一个堆一个方法区,实例就会启动线程来执行Main方法,(所有的Java程序的入口必须执行Main方法的).方法执行完后,类装载器会编译
.class的文件,并将读取到的类信息放到方法区.并且把读取到的(二进制的)类信息返回给JVM,JVM得到类型信息后,会立即取得ClassName,比如Bean, 并且在JAVA栈中入栈一个对Bean类型的引用,
Bean b ;并且有一个指向堆的指针,由Bean b 指向堆的指针,堆中的指针还会指向一个方法区的指针(用来存放方法)。当用new运算符的时候,会在堆中分配内存,把类型信息放进方法区中,并初始化类中的成员变量 int num = 0.这时候,调用new 之后的构造函数之后的时候,才真正的为对象分配内存(至于分配多大的内存,由JVM所读取的类型信息来决定),即 int num =5; 栈中的Bean b 的指针会指向堆中的对象。
并且在堆中还有一个指向方法区取得指针,这时候指针就会到方法区找到它所对应的way方法.
就完成了Java对象对方法的调用.


1 . 利用反射获得类名
2 . 找到,读入.class文件
3 . 提取类型信息到方法表
4 . 执行Main方法
5 . 在常量池以列项分配空间
6 . 判读.class文件是否加载
7.  如果成功加载,就获得对象类名得应用,否查找.class文件把信息放入方法区
8. JVM一个指向方法区的类数据结构指针替换到常量池的第一项
9. 为对象分配内存,并且用常量池中的第一项指针访问类型信息
10. 确定对象的大小,堆里分配,初始化实例化的变量 num=0;
11 生成对象的引用压入栈中
12.通过调用JAVA代码初始化成员变量,初始化正确的初始值 num=5
13. 通过对象引用调方法 (b.way())
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics