Java Compilation Process

来源:互联网 发布:龙与地下城 知乎 编辑:程序博客网 时间:2024/06/05 20:36

       Java是半解释语言,不同于C/C++的编译过程。一方面因为java程序运行在JVM上,另一方面原因是它不同于纯解释性语言,它有一个中间编译过程,java代码没有被直接编译为机器码,而是被编译为中间字节码,字节码运行在JVM上。

下图为java代码编译和执行过程。



compile: java要求每个类都被存放在以类名命名的.java文件中(不包括内部类),编译时每个类(包括内部类)都被编译为一个独立的.class字节码文件,字节码文件的数量至少      和.java文件一样多。假如正在编译的类依赖于另一个类,而另一个类未被编译或编译后进行了修改,java编译器将为你编译这些额外的类,这不同于gcc/g++,有些                       类似make,但实际没有相似之处。

loader:类加载和字节码校验是java区别于C/C++的两个独特过程。类加载器负责加载每一类的字节码,开发者可以实现自己的类加载器,可以加载任何位置的类。当JVM需要加载某个类时,the loadClass(String name, boolean resolve)方法将被调用,如果找到了name命名的字节码文件则读入内存并传给defineClass,否则将加载任务转给父加载类或在本地寻找系统类。

verifier:JVM规范没有详细描述字节码校验何时如何进行,但我们可以推断出是由defineClass完成的校验工作,校验是为了保证虚拟机可以安全地执行字节码文件。


字节码文件容易被反编译,例如使用工具jad

源:http://althing.cs.dartmouth.edu/local/www.acm.uiuc.edu/sigmil/RevEng/ch02.html

0 0
原创粉丝点击