我们先写一个HelloWorld.java文件
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
将HelloWorld.java编译为HelloWorld.class(也可以在eclipse等IDE都有右键以Class文件形式打开查看)
D:\java>javac HelloWorld.java
使用JDK自带的javap命令查看字节码
我们看到,里面有一个构造函数public HelloWorld();,那是因为Java 编译器在编译每个类时都会为该类至少生成一个实例初始化方法--即 "<init>()" 方法,这个init方法就是构造函数的另一个名称,是编译器指定的,但是并不能使用init(), ()V是代表无参函数,默认会帮你return.
#2 是得到System.out这个静态变量,源码是这样的
#3 是常量池中的常量值
#4 调用out的println方法,参数Ljava.lang.String是一个String的入参
实际使用中,如果类过大,可以将字节码输出到文件中再进行查看,下面就是将字节码保存到decompiled.txt文件中
javap -c class文件名 > decompiled.txt
更多javap的参数可以使用javap命令查看
这只是最简单的一个java文件,大家可以尝试在里面进行
HelloWorld helloWorld = new HelloWorld();
再编译查看字节码有什么效果
下面是在UltraEdit查看HelloWorld.class的效果,是16进制的显示形式
我们看到前有咖啡宝贝的标识,说明class字节码是有内置标识的,即使改名了也不会影响里面的内容,其他后面再写.