源自成富先生为InfoQ中文站撰写的《Java深度历险》专栏。本专栏的十篇文章,是关于Java不同方面但深入浅出的主题内容。
- Java深度历险(一)——Java字节代码的操纵
- Java深度历险(二)——Java类的加载、链接和初始化
- Java深度历险(三)——Java线程:基本概念、可见性与同步
- Java深度历险(四)——Java垃圾回收机制与引用类型
- Java深度历险(五)——Java泛型
- Java深度历险(六)——Java注解
- Java深度历险(七)——Java反射与动态代理
- Java深度历险(八)——Java I/O
- Java深度历险(九)——Java安全
- Java深度历险(十)——Java对象序列化与RMI
Java深度历险(一)——Java字节代码的操纵
在一般的Java应用开发过程中,开发人员使用Java的方式比较简单。打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了。这种开发模式背后的过程是:开发人员编写的是Java源代码文件(.java),IDE会负责调用Java的编译器把Java源代码编译成平台无关的字节代码(byte code),以类文件的形式保存在磁盘上(.class)。Java虚拟机(JVM)会负责把Java字节代码加载并执行。Java通过这种方式来实现其“编写一次,到处运行(Write once, run anywhere)” 的目标。Java类文件中包含的字节代码可以被不同平台上的JVM所使用。Java字节代码不仅可以以文件形式存在于磁盘上,也可以通过网络方式来下载,还可以只存在于内存中。JVM中的类加载器会负责从包含字节代码的字节数组(byte[])中定义出Java类。在某些情况下,可能会需要动态的生成 Java字节代码,或是对已有的Java字节代码进行修改。
动态编译Java源文件
在一般情况下,开发人员都是在程序运行之前就编写完成了全部的Java源代码并且成功编译。对有些应用来说,Java源代码的内容在运行时刻才能确定。这个时候就需要动态编译源代码来生成Java字节代码,再由JVM来加载执行。典型的场景是很多算法竞赛的在线评测系统(如PKU JudgeOnline),允许用户上传Java代码,由系统在后台编译、运行并进行判定。在动态编译Java源文件时,使用的做法是直接在程序中调用Java编译器。
JSR 199引入了Java编译器API。如果使用JDK 6的话,可以通过此API来动态编译Java代码。比如下面的代码用来动态编译最简单的Hello World类。该Java类的代码是保存在一个字符串中的。
Java深度历险(二)——Java类的加载、链接和初始化
Java深度历险(三)——Java线程:基本概念、可见性与同步
Java深度历险(四)——Java垃圾回收机制与引用类型
Java深度历险(五)——Java泛型
Java深度历险(六)——Java注解
Java深度历险(七)——Java反射与动态代理
Java深度历险(八)——Java I/O
Java深度历险(九)——Java安全
Java深度历险(十)——Java对象序列化与RMI
Reference
[1]Java深度历险(一)——Java字节代码的操纵
[2]Java深度历险(二)——Java类的加载、链接和初始化
[3]Java深度历险(三)——Java线程:基本概念、可见性与同步
[4]Java深度历险(四)——Java垃圾回收机制与引用类型
[5]Java深度历险(五)——Java泛型
[6]Java深度历险(六)——Java注解
[7]Java深度历险(七)——Java反射与动态代理
[8]Java深度历险(八)——Java I/O
[9]Java深度历险(九)——Java安全
[10]Java深度历险(十)——Java对象序列化与RMI