安装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 引用从局部变量表加载到操作数栈上,以便在后续的字节码指令中使用。