潜移默化剖析方法慢速查找流程
2023-12-19 19:41:50
在Java虚拟机中,方法调用是一种非常重要的操作,而方法的查找过程是至关重要的。方法查找分为两种:快速查找和慢速查找。快速查找是一种高效的查找方式,它直接从符号表中查找目标方法,而慢速查找则需要遍历整个继承层次结构,查找目标方法。
方法慢速查找流程
-
确定查找起始类
首先,需要确定方法慢速查找的起始类。如果方法调用发生在静态上下文中,那么起始类就是该方法所属的类;如果方法调用发生在实例上下文中,那么起始类就是该实例所属的类。 -
查找目标方法
接下来,需要在起始类及其父类中查找目标方法。查找过程从起始类开始,依次向上遍历父类,直到找到目标方法或到达根类(java.lang.Object)。在查找过程中,如果在某个类中找到了目标方法,那么方法查找过程就结束了;如果在某个类中没有找到目标方法,那么就继续向上遍历父类。 -
处理方法重写
在查找过程中,如果在某个类中找到了一个与目标方法同名但签名不同的方法,那么就需要判断该方法是否重写了目标方法。如果该方法重写了目标方法,那么就将该方法作为目标方法;如果该方法没有重写目标方法,那么就继续向上遍历父类。 -
处理方法重载
在查找过程中,如果在某个类中找到了多个与目标方法同名但签名不同的方法,那么就需要判断这些方法是否重载了目标方法。如果这些方法重载了目标方法,那么就选择其中一个方法作为目标方法;如果这些方法没有重载目标方法,那么就继续向上遍历父类。 -
处理接口方法
在查找过程中,如果在某个类中找到了一个目标方法,但该方法是接口方法,那么就需要在该接口的所有实现类中查找目标方法。查找过程从该类开始,依次向上遍历父类,直到找到目标方法或到达根类(java.lang.Object)。在查找过程中,如果在某个类中找到了目标方法,那么方法查找过程就结束了;如果在某个类中没有找到目标方法,那么就继续向上遍历父类。 -
处理抽象方法
在查找过程中,如果在某个类中找到了一个目标方法,但该方法是抽象方法,那么就需要在该类的所有子类中查找目标方法。查找过程从该类开始,依次向上遍历子类,直到找到目标方法或到达根类(java.lang.Object)。在查找过程中,如果在某个类中找到了目标方法,那么方法查找过程就结束了;如果在某个类中没有找到目标方法,那么就继续向上遍历子类。
字段查找
在Java虚拟机中,字段查找是一种非常重要的操作,而字段的查找过程是至关重要的。字段查找分为两种:快速查找和慢速查找。快速查找是一种高效的查找方式,它直接从符号表中查找目标字段,而慢速查找则需要遍历整个继承层次结构,查找目标字段。
字段慢速查找流程
-
确定查找起始类
首先,需要确定字段慢速查找的起始类。如果字段访问发生在静态上下文中,那么起始类就是该字段所属的类;如果字段访问发生在实例上下文中,那么起始类就是该实例所属的类。 -
查找目标字段
接下来,需要在起始类及其父类中查找目标字段。查找过程从起始类开始,依次向上遍历父类,直到找到目标字段或到达根类(java.lang.Object)。在查找过程中,如果在某个类中找到了目标字段,那么字段查找过程就结束了;如果在某个类中没有找到目标字段,那么就继续向上遍历父类。 -
处理字段重写
在查找过程中,如果在某个类中找到了一个与目标字段同名但类型不同的字段,那么就需要判断该字段是否重写了目标字段。如果该字段重写了目标字段,那么就将该字段作为目标字段;如果该字段没有重写目标字段,那么就继续向上遍历父类。 -
处理字段重载
在查找过程中,如果在某个类中找到了多个与目标字段同名但类型不同的字段,那么就需要判断这些字段是否重载了目标字段。如果这些字段重载了目标字段,那么就选择其中一个字段作为目标字段;如果这些字段没有重载目标字段,那么就继续向上遍历父类。 -
处理接口字段
在查找过程中,如果在某个类中找到了一个目标字段,但该字段是接口字段,那么就需要在该接口的所有实现类中查找目标字段。查找过程从该类开始,依次向上遍历父类,直到找到目标字段或到达根类(java.lang.Object)。在查找过程中,如果在某个类中找到了目标字段,那么字段查找过程就结束了;如果在某个类中没有找到目标字段,那么就继续向上遍历父类。 -
处理抽象字段
在查找过程中,如果在某个类中找到了一个目标字段,但该字段是抽象字段,那么就需要在该类的所有子类中查找目标字段。查找过程从该类开始,依次向上遍历子类,直到找到目标字段或到达根类(java.lang.Object)。在查找过程中,如果在某个类中找到了目标字段,那么字段查找过程就结束了;如果在某个类中没有找到目标字段,那么就继续向上遍历子类。