在前一篇 第3篇-CallStub新栈帧的创建 中我们介绍了generate_call_stub()函数的部分实现,完成了向CallStub栈帧中压入参数的操作,此时的状态如下图所示. 继续看generate_call_stub()函数的实现,接来下会加载线程寄存器,代码如下: // Load up thread register __ movptr(r15_thread, thread); __ reinit_heapbase(); 生成的汇编代码如下: mov 0x18(%rbp),%r15…
在第1篇中大概介绍过Java中主类方法main()的调用过程,这一篇介绍的详细一点,大概的调用过程如下图所示. 其中浅红色的函数由主线程执行,而另外的浅绿色部分由另外一个线程执行,这个线程最终也会负责执行Java主类中的main()方法.在JavaMain()函数中调用LoadMainClass()函数加载Java主类.接着在JavaMain()函数中有如下调用: 源代码位置:openjdk/jdk/src/share/bin/java.c mainID = (*env)->GetStaticM…
在前一篇 第1篇-关于JVM运行时,开篇说的简单些 中介绍了call_static().call_virtual()等函数的作用,这些函数会调用JavaCalls::call()函数.我们看Java类中main()方法的调用,调用栈如下: JavaCalls::call_helper() at javaCalls.cpp os::os_exception_wrapper() at os_linux.cpp JavaCalls::call() at javaCalls.cpp jni_invoke…
方法1:A a=new test().new A(); 内部类对象通过外部类的实例对象调用其内部类构造方法产生,如下: public class test{ class A{ void fA(){ System.out.println("we are students"); } } public static void main(String args[]){ System.out.println("Hello, 欢迎学习JAVA"); A a=new test()…
22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表.然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法showB输出大写的英文字母表.最后编写主类C,在主类的main方法 中测试类A与类B. package jicheng; public class A { public void showA() { System.out.println("asdfsdf"); } } package jic…
package com.hanqi.test; public class xiyoujirenwu { private double height;// 身高 private String name;// 名称 private String weapon;// 武器 public double getHeight() { return height; } public void setHeight(double height) { if(height<=10) { System.out.prin…