代码编译的结果是从本地机器码变成字节码,即java文件变成class文件。class文件中有很多信息,这些信息最终都要加载到虚拟机中才能运行和使用。而虚拟机如何加载这些class文件呢?class文件中的信息加载到虚拟机后会发生什么变化呢?
虚拟机类加载机制系列文章中的class文件不是特指存在于具体磁盘中的文件,而是一串二进制的字节流,无论以何种形式存在的都可以。
虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制。
与那些在编译时需要进行连接工作的语言不同,在java中,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会为java应用程序提供高度的灵活性,java中天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。例如:如果编写一个面向接口的应用程序,可以等到运行时再指定其实际的实现类;用户可以通过java预定义的和自定义的类加载器,让一个本地的应用程序可以在运行时从网络或其他地方加载一个二进制流作为作为程序代码的一部分,这种组装应用程序的方式目前已广泛应用于java程序之中。从基础的JSP到复杂的OSGi技术,都使用了java语言运行期类加载的特性。
参考文章:《深入理解java虚拟机》周志明著