Java Compilation Process

       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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值