<commit_before>java7之前，java虚拟机提供了四种方法调用的指令
    1.invokestatic用来调用静态方法
    2.invokespecial用来调用无须动态绑定的方法，包括：构造函数、私有方法和super关键字调用的方法
下面两种属于动态绑定
    3.invokeinterface调用接口方法
    4.否则调用invokevirtual

java7之后新增invokedynamic指令用于支持动态语言

方法调用指令需要 n+1 个操作数，其中第一个操作数是uint16索引，紧跟在操作码指令后面。
通过这个索引，可以在当前类的运行时常量池中找到一个方法符号引用，解析这个符号可以得到一个方法。
注意：
    这个方法不一定就是最终要调用的方法，可能还需要一个查找过程才能找到最终调用的方法

剩下的 n 个操作数就是要传递给这个方法的参数，从操作数栈中弹出

invoke virtual 和 invoke interface：
    invoke interface可以用 virtual 来替换！但是会影响效率

    invoke virtual时，this引用指向某个类 或 其子类 的实例，举个例子：

    class Superclass {
        private void interestingMethod() {
            System.out.println("Superclass's interesting method.");
        }

        void exampleMethod() {
            interestingMethod();
        }
    }

    class Subclass extends Superclass {
        void interestingMethod() {
            System.out.println("Subclass's interesting method.");
        }

        public static void main(String args[]) {
            Subclass me = new Subclass();
            me.exampleMethod();
        }
    }

    main 方法的字节码：
        0:   new     #5; //class Subclass
        3:   dup
        4:   invokespecial   #6; //Method "<init>":()V
        7:   astore_1
        8:   aload_1
        9:   invokevirtual   #7; //Method exampleMethod:()V
        12:  return

    Subclass从Superclass处继承了exampleMethod()方法。
    当Subclass的me对象调用exampleMethod()时使用的是invokevirtual。
    JVM会创建一个新的栈帧并将其压入栈，然后执行exampleMethod()的bytecode。

    下面是exampleMethod()的bytecode：
        0:   aload_0   <-   这里是加载了Subclass的实例
        1:   invokespecial   #5; //Method interestingMethod:()V
        4:   return

    exampleMethod()首先将赋给局部变量 0 的 reference 压入stack（隐含参数this被传入给所有的实例方法）
    ，然后使用invokespecial指令通过这个引用调用interestingMethod()。
    尽管这里的对象时Subclass的实例，而且Subclass类中的interestingMethod()方法也是能够访问的，但是JVM最终还是调用了Superclass类中的interestingMethod()方法。<commit_msg>invoke interface  和一些笔记<commit_after>java7之前，java虚拟机提供了四种方法调用的指令
    1.invokestatic用来调用静态方法
    2.invokespecial用来调用无须动态绑定的方法，包括：构造函数、私有方法和super关键字调用的方法
下面两种属于动态绑定
    3.invokeinterface调用接口方法
    4.否则调用invokevirtual

java7之后新增invokedynamic指令用于支持动态语言

方法调用指令需要 n+1 个操作数，其中第一个操作数是uint16索引，紧跟在操作码指令后面。
通过这个索引，可以在当前类的运行时常量池中找到一个方法符号引用，解析这个符号可以得到一个方法。
注意：
    这个方法不一定就是最终要调用的方法，可能还需要一个查找过程才能找到最终调用的方法

剩下的 n 个操作数就是要传递给这个方法的参数，从操作数栈中弹出

invoke virtual 和 invoke interface：
    invoke interface可以用 virtual 来替换！但是会影响效率

    invoke virtual时，this引用指向某个类 或 其子类 的实例，举个例子：

    class Superclass {
        private void interestingMethod() {
            System.out.println("Superclass's interesting method.");
        }

        void exampleMethod() {
            interestingMethod();
        }
    }

    class Subclass extends Superclass {
        void interestingMethod() {
            System.out.println("Subclass's interesting method.");
        }

        public static void main(String args[]) {
            Subclass me = new Subclass();
            me.exampleMethod();
        }
    }

    main 方法的字节码：
        0:   new     #5; //class Subclass
        3:   dup
        4:   invokespecial   #6; //Method "<init>":()V
        7:   astore_1
        8:   aload_1
        9:   invokevirtual   #7; //Method exampleMethod:()V
        12:  return

    Subclass从Superclass处继承了exampleMethod()方法。
    当Subclass的me对象调用exampleMethod()时使用的是invokevirtual。
    JVM会创建一个新的栈帧并将其压入栈，然后执行exampleMethod()的bytecode。

    下面是exampleMethod()的bytecode：
        0:   aload_0   <-   这里是加载了Subclass的实例
        1:   invokespecial   #5; //Method interestingMethod:()V
        4:   return

    exampleMethod()首先将赋给局部变量 0 的 reference 压入stack（隐含参数this被传入给所有的实例方法）
    ，然后使用invokespecial指令通过这个引用调用interestingMethod()。
    尽管这里的对象时Subclass的实例，而且Subclass类中的interestingMethod()方法也是能够访问的，但是JVM最终还是调用了Superclass类中的interestingMethod()方法。

    继续上面说的（invoke virtual时，this引用指向某个类 或 其子类 的实例）
    类的继承关系是固定的，虚拟机用一种叫vtable（Virtual method table）的技术加速方法查找。
    但是通过invoke interface指令调用接口方法时，this引用可以指向任何实现了该接口的类实例
{'fraction_non_alphanumeric': 0.07670815341630684, 'fraction_numerical': 0.014224028448056897, 'mean_word_length': 3.1149425287356323, 'pattern_counts': {'":': 2, '<': 7, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3852792', 'n_tokens_mistral': 1819, 'n_tokens_neox': 1949, 'n_words': 223}