内容提要
- 类加载
- 方法句柄
- 解剖类文件
- JVM字节码以及它的重要性
- 新的操作码
invokedynamic
要成为优秀的Java开发人员,需要深入理解Java平台的工作方式。其中就包括类加载和JVM字节码这样的核心特性。
假设有一个大量使用依赖注入(DI)技术的应用程序,比如Spring,它在启动时出了问题,报了一个神秘的错误信息。如果不是简单的配置错误问题,你就需要了解如何实现DI框架才能跟踪问题来源。也就是说你得明白类加载机制。
或者假定跟你合作的开发商跑路了,只给你留下了一堆编译过的代码,没有源码,文档也乱七八糟的。你怎么能知道编译过的代码包含了什么呢?
最常见的程序启动失败错误就是ClassNotFoundException
或NoClassDefFoundError
,但很多开发人员都不知道它们是什么,有什么区别以及为什么会出现。
本章重点就是这些与开发相关的平台特性。此外还会讨论一些高级特性——它们是为Java的粉丝准备的,如果你时间有限,可以跳过那部分内容。
我们会从类加载的概览开始,这是VM为运行中的程序定位和激活新类型的过程。其核心是在VM中表示类型的Class
对象。接下来我们会介绍一下新的方法句柄API,并和Java 6中已有的技术(比如反射)进行比较。
之后我们会讨论检查和分析类文件的工具。用Oracle JDK提供的javap
作为参考工具。上过类文件的解剖课后,我们会转而讨论字节码,其中涉及JVM操作码的主要体系以及运行时的底层操作。
在你用字节码的知识把自己武装起来之后,我们会深入探讨invokedynamic
操作码,它是Java 7新引入进来的,为的是让非Java语言能充分利用JVM的平台特性。
我们先从类加载开始吧,这是一个将新的类合并到正在运行着的JVM进程中的过程。