返回

潜移默化剖析方法慢速查找流程

IOS

在Java虚拟机中,方法调用是一种非常重要的操作,而方法的查找过程是至关重要的。方法查找分为两种:快速查找和慢速查找。快速查找是一种高效的查找方式,它直接从符号表中查找目标方法,而慢速查找则需要遍历整个继承层次结构,查找目标方法。

方法慢速查找流程

  1. 确定查找起始类
    首先,需要确定方法慢速查找的起始类。如果方法调用发生在静态上下文中,那么起始类就是该方法所属的类;如果方法调用发生在实例上下文中,那么起始类就是该实例所属的类。

  2. 查找目标方法
    接下来,需要在起始类及其父类中查找目标方法。查找过程从起始类开始,依次向上遍历父类,直到找到目标方法或到达根类(java.lang.Object)。在查找过程中,如果在某个类中找到了目标方法,那么方法查找过程就结束了;如果在某个类中没有找到目标方法,那么就继续向上遍历父类。

  3. 处理方法重写
    在查找过程中,如果在某个类中找到了一个与目标方法同名但签名不同的方法,那么就需要判断该方法是否重写了目标方法。如果该方法重写了目标方法,那么就将该方法作为目标方法;如果该方法没有重写目标方法,那么就继续向上遍历父类。

  4. 处理方法重载
    在查找过程中,如果在某个类中找到了多个与目标方法同名但签名不同的方法,那么就需要判断这些方法是否重载了目标方法。如果这些方法重载了目标方法,那么就选择其中一个方法作为目标方法;如果这些方法没有重载目标方法,那么就继续向上遍历父类。

  5. 处理接口方法
    在查找过程中,如果在某个类中找到了一个目标方法,但该方法是接口方法,那么就需要在该接口的所有实现类中查找目标方法。查找过程从该类开始,依次向上遍历父类,直到找到目标方法或到达根类(java.lang.Object)。在查找过程中,如果在某个类中找到了目标方法,那么方法查找过程就结束了;如果在某个类中没有找到目标方法,那么就继续向上遍历父类。

  6. 处理抽象方法
    在查找过程中,如果在某个类中找到了一个目标方法,但该方法是抽象方法,那么就需要在该类的所有子类中查找目标方法。查找过程从该类开始,依次向上遍历子类,直到找到目标方法或到达根类(java.lang.Object)。在查找过程中,如果在某个类中找到了目标方法,那么方法查找过程就结束了;如果在某个类中没有找到目标方法,那么就继续向上遍历子类。

字段查找

在Java虚拟机中,字段查找是一种非常重要的操作,而字段的查找过程是至关重要的。字段查找分为两种:快速查找和慢速查找。快速查找是一种高效的查找方式,它直接从符号表中查找目标字段,而慢速查找则需要遍历整个继承层次结构,查找目标字段。

字段慢速查找流程

  1. 确定查找起始类
    首先,需要确定字段慢速查找的起始类。如果字段访问发生在静态上下文中,那么起始类就是该字段所属的类;如果字段访问发生在实例上下文中,那么起始类就是该实例所属的类。

  2. 查找目标字段
    接下来,需要在起始类及其父类中查找目标字段。查找过程从起始类开始,依次向上遍历父类,直到找到目标字段或到达根类(java.lang.Object)。在查找过程中,如果在某个类中找到了目标字段,那么字段查找过程就结束了;如果在某个类中没有找到目标字段,那么就继续向上遍历父类。

  3. 处理字段重写
    在查找过程中,如果在某个类中找到了一个与目标字段同名但类型不同的字段,那么就需要判断该字段是否重写了目标字段。如果该字段重写了目标字段,那么就将该字段作为目标字段;如果该字段没有重写目标字段,那么就继续向上遍历父类。

  4. 处理字段重载
    在查找过程中,如果在某个类中找到了多个与目标字段同名但类型不同的字段,那么就需要判断这些字段是否重载了目标字段。如果这些字段重载了目标字段,那么就选择其中一个字段作为目标字段;如果这些字段没有重载目标字段,那么就继续向上遍历父类。

  5. 处理接口字段
    在查找过程中,如果在某个类中找到了一个目标字段,但该字段是接口字段,那么就需要在该接口的所有实现类中查找目标字段。查找过程从该类开始,依次向上遍历父类,直到找到目标字段或到达根类(java.lang.Object)。在查找过程中,如果在某个类中找到了目标字段,那么字段查找过程就结束了;如果在某个类中没有找到目标字段,那么就继续向上遍历父类。

  6. 处理抽象字段
    在查找过程中,如果在某个类中找到了一个目标字段,但该字段是抽象字段,那么就需要在该类的所有子类中查找目标字段。查找过程从该类开始,依次向上遍历子类,直到找到目标字段或到达根类(java.lang.Object)。在查找过程中,如果在某个类中找到了目标字段,那么字段查找过程就结束了;如果在某个类中没有找到目标字段,那么就继续向上遍历子类。