栈桢与操作数栈以及符号引用与直接引用的转换

1、栈桢(stack frame)
栈桢是一种用于帮助虚拟机执行方法调用与方法执行的数据结构。
栈桢本身是一种数据结构,封装了方法的局部变量表、动态链接信息,方法的返回地址以及操作数栈等信息

2、符号引用,直接引用
有些符号引用是在类加载阶段或是第一次使用时就会转换为直接引用,这种转换叫做静态解析;
另外一些符号引用则是在每次运行期转换为直接引用,这种转换叫动态链接,这提现为Java的多态

如下面的伪代码

    Animal a = new Cat();
    a.sleep();
    a = new Dog();
     a.sleep();
    a = new Tiger();
     a.sleep();

  Animal是父类,其它Cat,Dog,Tiger是子类。在编译期是不知道a指向那个实例,在运行期才知道具体指向Cat,还是Dog,还是Tiger

3、字节码指令

1、invokeinterface: 调用接口中的方法,实际上是运行期决定的,决定到底调用实现该接口的哪个对象的特定方法

2、invokestatic: 调用静态方法
3、invokespecial: 调用自己的私有方法,构造方法(<init>)以及父类的方法
4、invokevirtual: 调用虚方法,运行期动态查找的过程
5、invokedynamic: 动态调用方法

4、创建MyTest4类

1
2
3
4
5
6
7
8
9
10
public class MyTest4 {
 
    public static  void  test(){
        System.out.println("test invoked");
    }
 
    public static  void main(String[] args){
        test();
    }
}

  查看jclasslib的main方法

可以看到invokestatic指令,调用MyTest4的静态方法test

5、静态解析的4种情形

1、静态方法
2、父类方法
3、构造方法
4、私有方法(无法被重写)
以上四类方法成为非虚方法,他们是在类加载阶段就可以将符号引用转换为直接引用

原文地址:https://www.cnblogs.com/linlf03/p/11107787.html