- Java字节码
Java源程序(.java)要先编译成与平台无关的字节码文件(.class),然后字节码文件再解释成机器码运行。解释是通过Java虚拟机来执行的。
- java要运行要经过如下步骤
① Java源文件—->编译器(工具)—->字节码文件
② 字节码文件—->JVM(工具)—->机器码
- c++运行步骤
c++源文件–>编译器 -->机器码
问题在于,每个平台所认识的0101序列并不一样。在Windows上也许某个指令是0101,在Linux下也许是1010,因此不同的平台必须使用不同的编译器来编译你的代码,而在Windows平台上编译好的程序,也不能直接拿到Linux等其它平台上执行,而必须经过重新编译的动作,让编译器将你的程式编译为该平台可以执行的指令。
- Java具有平台的无关性。使用Java虚拟机实现这一特点。
Java编译时,并不直接翻译为相依于某平台的0101指令,而是翻译为中介格式的位元码(byte code)。Java 的原始码文件格式名为*.java,经过编译器翻译过后,会变成*.class的格式文件位元码。如果想要执行这个位元码档案,目标平台上必须安装有JVM(Java Virtual Machine)。JVM会将位元码翻译为相应平台支持的语言。
不同的平台必须安装该平台相对应的JVM。而对于JVM而言,位元码文件就是它的可执行文件,也就是格式为.class的文件。Java代码程序,理想上,并不用理会真正执行于哪个平台之上,它只要知道如何执行于JVM之上就可以了,至于JVM实际上如何与底层平台作沟通,则是JVM自己的事
一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。
而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。
Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码**(字节码)**,就可以在多种平台上不加修改地运行。
Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令**(机器码)**执行。这就是Java的能够“一次编译,到处运行”的原因。
- 获取class字节码文件常用的三种方法
Class clazz = Class.forName("包.类名称") //在源文件阶段获取class字节码文件
Class clazz = 类名.Class //在编译阶段获取class字节码文件
Class clazz = 类对象.getClass() //在运行阶段通过生成的对象的来获取class字节码文件 //这三种方法获取的类对象是同一个。