IDEA字节码插件 && this字节码
AI-摘要
Tianli GPT
AI初始化中...
安装IDEA插件
查看字节码文件
使用IDEA编译之后再打开字节码文件
TIPS:
代码中调用方法即使不含this,但是在编译器编译之后,仍默认包含当前运行类型的对象引用,示例如下:
public interface SocketService {
boolean support();
void service();
}
public abstract class AbstractSocketService<V> implements SocketService {
@Override
public boolean support() {
return false;
}
@Override
public void service() {
try {
support();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class LoginService extends AbstractSocketService {
@Override
public boolean support() {
return super.support();
}
}
AbstractSocketService类方法的字节码如下:
0 aload_0
1 invokevirtual #2 <AbstractSocketService.support : ()Z>
4 pop
5 goto 13 (+8)
8 astore_1
9 aload_1
10 invokevirtual #4 <java/lang/Exception.printStackTrace : ()V>
13 return
aload_0
是 Java 字节码指令之一,它将局部变量表中索引为 0 的变量加载到操作数栈上。在实例方法中,局部变量表索引 0 处保存的就是隐含的 this
引用。
在 JVM 中,每个线程都有一个栈,每个方法调用都有一个栈帧。每个栈帧中有一个局部变量表,用于存储方法的参数和局部变量。在实例方法中,局部变量表的第一个槽(索引为 0)总是保存着对当前对象实例的引用,即 this
。
当调用一个实例方法时,this
引用自动传递给方法,并存储在局部变量表的第一个位置。aload_0
指令用于将这个 this
引用从局部变量表加载到操作数栈上,以便在后续的字节码指令中使用。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 NOTE_BLOG
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果
音乐天地