活动介绍

JDK9新特性与使用指南

立即解锁
发布时间: 2025-08-18 02:22:40 阅读量: 2 订阅数: 8
# JDK 9 新特性与使用指南 ## 1. JDK 9 简介 JDK 9 是 Java 开发工具包的第九个主要版本,计划于 2017 年 7 月下旬发布。它带来了许多令人兴奋的新特性,以下是一些重要特性的介绍: - **模块系统(Jigsaw 项目)**:JDK 设计者花了十多年时间尝试将模块系统引入 Java 平台。该系统的主要目标是让 Java 开发者能以模块这种软件组件来开发应用。模块可以导出其 API 供外部使用,同时封装内部实现。模块还能声明对其他模块的依赖,并在启动时验证这些依赖,避免因缺失类型而导致的运行时问题。JDK 本身也被拆分为一组相互交互的模块,提供了可扩展的运行时环境。如果应用只使用 JDK 的一部分,还能创建包含所需 JDK 模块和应用模块的运行时镜像。不过,模块系统面临的主要难题是向后兼容性以及迁移和适配路径,经过多次基于社区反馈的重新设计和改进,最终得以发布。 - **JShell**:这是 Java 的 REPL(Read - Eval - Print Loop)工具,既是命令行工具也是 API。它允许开发者执行代码片段并立即获得反馈,而在 JShell 出现之前,开发者需要编写完整程序、编译并运行才能得到反馈。JShell 对初学者很重要,能帮助他们在不了解模块和包等程序结构细节的情况下快速学习 Java 语言。 - **其他特性**:还包括 Reactive Streams API、集合工厂方法、HTTP/2 客户端 API、Stack - Walking API、平台日志 API 和统一的 JVM 日志等。 ## 2. 阅读指南 相关内容共包含 20 个章节,各章节的阅读建议如下: |章节|内容|阅读建议| | ---- | ---- | ---- | |第 2 - 10 章|模块系统|建议按顺序阅读。虽然不了解模块系统也可能将现有应用迁移到 JDK 9,但要充分利用 JDK 9 的优势,就必须学习并使用模块系统来开发新应用和迁移旧应用。| |第 11 章|Java Shell|可在不阅读前 10 章的情况下阅读,但按顺序阅读能获得更全面的理解。| |第 12 - 20 章|独立主题|可按任意顺序阅读。最后一章涵盖了一些较小的主题。| 下面对各章节的主要内容做简要介绍: - **第 2 章:模块系统**:回顾 Java 9 之前的情况,介绍新的模块系统,包括模块的定义、依赖关系、模块图、聚合模块等概念,还会涉及模块的声明、命名、访问控制、依赖声明、服务配置等内容。 - **第 3 章:创建第一个模块**:通过命令行和 NetBeans IDE 两种方式,逐步展示如何声明模块、编写代码、编译模块和运行模块中的类。 - **第 4 章:模块依赖**:深入探讨模块依赖的声明,解决可能出现的问题,如空包错误、模块未找到错误等。还会介绍隐式可读性、限定导出、可选依赖、反射访问模块等内容,以及不同类型的模块和迁移到 JDK 9 的路径。 - **第 5 章:实现服务**:介绍如何利用模块系统的简单指令在 JDK 9 中实现服务,同时解释 JDK 9 之前服务的实现方式。 - **第 6 章:打包模块**:解释可以用来打包模块的不同格式,如 JAR 和 JMOD 格式,并说明何时选择哪种格式。在 JDK 8 及以前,只能使用 JAR 文件打包 Java 应用。 - **第 7 章:创建自定义运行时镜像**:讲解如何使用 jlink 工具创建内部格式为 JIMAGE 的自定义运行时镜像。 - **第 8 章:JDK 9 中的重大变更**:解释迁移到 JDK 9 时可能会导致现有应用出现问题的变更,并提供修复建议和替代方案。 - **第 9 章:打破模块封装**:说明如何打破模块系统的封装特性。JDK 9 提供了一些非标准的命令行选项,可用于访问原本封装不可访问的模块代码,这在迁移使用过 JDK 内部 API 或第三方库的遗留应用时可能会用到。 - **第 10 章:模块 API**:介绍如何通过 Module API 以编程方式访问模块系统,使用模块声明和命令行选项能完成的操作,使用 Module API 也能实现。 - **第 11 章:Java Shell**:详细介绍 JShell 工具和 JShell API,包括启动和退出 JShell 工具、代码片段和命令的使用、表达式求值、变量声明、方法声明等内容,还会涉及 JShell 的配置和使用 JShell API 执行代码片段。 - **第 12 章:进程 API 更新**:介绍 JDK 9 中进程 API 的新增内容,但不涵盖自 JDK 1.0 以来的整个进程 API。 下面是一个简单的 mermaid 流程图,展示了模块系统相关章节的关系: ```mermaid graph LR A[第 2 章:模块系统] --> B[第 3 章:创建第一个模块] B --> C[第 4 章:模块依赖] C --> D[第 5 章:实现服务] D --> E[第 6 章:打包模块] E --> F[第 7 章:创建自定义运行时镜像] F --> G[第 8 章:JDK 9 中的重大变更] G --> H[第 9 章:打破模块封装] H --> I[第 10 章:模块 API] ``` 通过以上介绍,开发者可以对 JDK 9 的新特性和各章节内容有一个初步的了解,为进一步学习和使用 JDK 9 打下基础。 ## 3. 系统要求与环境搭建 ### 3.1 系统要求 使用相关示例代码需要满足一定的系统要求,不过文档中未详细提及具体的系统要求信息,建议参考官方文档以确保系统环境能够支持 JDK 9 的运行。 ### 3.2 安装 NetBeans IDE 安装 NetBeans IDE 可以按照以下步骤进行: 1. 访问 NetBeans 官方网站,下载适合自己操作系统的安装包。 2. 运行安装包,按照安装向导的提示进行操作。在安装过程中,可能需要选择安装路径、组件等信息,根据自己的需求进行选择。 3. 完成安装后,启动 NetBeans IDE,进行必要的配置,如设置 JDK 路径等。 ### 3.3 下载源代码 可以通过访问指定的网址 http://www.apress.com/us/book/9781484225912 来获取相关示例的源代码。下载完成后,将源代码解压到合适的目录,以便后续使用。 ## 4. 部分特性详细介绍 ### 4.1 模块系统详细内容 #### 4.1.1 模块的基本概念 - **模块定义**:模块是一种软件组件,它可以导出其 API 供其他模块使用,同时封装内部实现。例如,一个模块可以包含一组相关的类和接口,它可以选择将其中一部分类和接口导出,而将其他部分隐藏起来。 - **模块依赖**:模块可以声明对其他模块的依赖,在启动时会验证这些依赖关系。例如,模块 A 依赖于模块 B,那么在运行模块 A 时,系统会确保模块 B 已经正确加载。 - **模块图**:模块之间的依赖关系可以用模块图来表示,它展示了模块之间的相互关系。 #### 4.1.2 模块声明与配置 - **模块声明**:需要在模块描述文件(module-info.java)中声明模块的名称、导出的包、依赖的模块等信息。例如: ```java module myModule { exports com.example.myPackage; requires otherModule; } ``` - **模块访问控制**:可以通过 `exports` 关键字控制哪些包可以被其他模块访问,通过 `requires` 关键字声明对其他模块的依赖。 - **模块版本**:可以为模块指定版本号,方便管理和维护。 #### 4.1.3 模块类型 - **正常模块**:具有明确的模块声明和依赖关系的模块。 - **开放模块**:允许反射访问其所有包的模块。 - **自动模块**:由传统的 JAR 文件转换而来的模块,其模块名和依赖关系根据 JAR 文件的名称和内容自动推断。 - **未命名模块**:没有显式模块声明的代码所在的模块。 ### 4.2 Java Shell 详细内容 #### 4.2.1 JShell 基本操作 - **启动和退出**:可以通过命令行启动 JShell 工具,输入 `jshell` 命令即可。退出 JShell 可以使用 `/exit` 命令。 - **代码片段和命令**:在 JShell 中可以输入代码片段,如表达式、变量声明、方法声明等,也可以使用一些命令,如 `/list` 列出所有代码片段,`/edit` 编辑代码片段等。 - **表达式求值**:输入表达式后,JShell 会立即计算并输出结果。例如,输入 `2 + 3`,JShell 会输出 `$1 ==> 5`。 #### 4.2.2 JShell 配置 - **设置反馈模式**:可以通过 `/set feedback` 命令设置不同的反馈模式,如 `verbose` 模式会输出更详细的信息。 - **设置启动代码片段**:可以在配置文件中设置启动时自动执行的代码片段。 下面是一个简单的 mermaid 流程图,展示了 Java Shell 的基本使用流程: ```mermaid graph LR A[启动 JShell] --> B[输入代码片段] B --> C{是否有效} C -- 是 --> D[输出结果] C -- 否 --> E[提示错误] D --> F{是否继续输入} F -- 是 --> B F -- 否 --> G[退出 JShell] ``` ## 5. 总结 JDK 9 带来了众多重要的新特性,其中模块系统和 Java Shell 是两个非常突出的特性。模块系统解决了 Java 开发中长期存在的一些问题,如 API 封装、配置和可扩展性等问题,为 Java 应用的开发和维护提供了更好的支持。Java Shell 则大大提高了开发效率,让开发者能够更快速地验证代码。此外,JDK 9 还包含了其他许多有用的特性,如 Reactive Streams API、HTTP/2 客户端 API 等。开发者可以根据自己的需求,深入学习和使用这些特性,提升自己的开发能力和应用的质量。
corwn 最低0.47元/天 解锁专栏
赠100次下载
点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

李_涛

知名公司架构师
拥有多年在大型科技公司的工作经验,曾在多个大厂担任技术主管和架构师一职。擅长设计和开发高效稳定的后端系统,熟练掌握多种后端开发语言和框架,包括Java、Python、Spring、Django等。精通关系型数据库和NoSQL数据库的设计和优化,能够有效地处理海量数据和复杂查询。
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
立即解锁

专栏目录

最新推荐

编程中的数组应用与实践

### 编程中的数组应用与实践 在编程领域,数组是一种非常重要的数据结构,它可以帮助我们高效地存储和处理大量数据。本文将通过几个具体的示例,详细介绍数组在编程中的应用,包括图形绘制、随机数填充以及用户输入处理等方面。 #### 1. 绘制数组图形 首先,我们来创建一个程序,用于绘制存储在 `temperatures` 数组中的值的图形。具体操作步骤如下: 1. **创建新程序**:选择 `File > New` 开始一个新程序,并将其保存为 `GraphTemps`。 2. **定义数组和画布大小**:定义一个 `temperatures` 数组,并设置画布大小为 250 像素×250 像

Hibernate:从基础使用到社区贡献的全面指南

# Hibernate:从基础使用到社区贡献的全面指南 ## 1. Hibernate拦截器基础 ### 1.1 拦截器代码示例 在Hibernate中,拦截器可以对对象的加载、保存等操作进行拦截和处理。以下是一个简单的拦截器代码示例: ```java Type[] types) { if ( entity instanceof Inquire) { obj.flushDirty(); return true; } return false; } public boolean onLoad(Object obj, Serial

ApacheThrift在脚本语言中的应用

### Apache Thrift在脚本语言中的应用 #### 1. Apache Thrift与PHP 在使用Apache Thrift和PHP时,首先要构建I/O栈。以下是构建I/O栈并调用服务的基本步骤: 1. 将传输缓冲区包装在二进制协议中,然后传递给服务客户端的构造函数。 2. 构建好I/O栈后,打开套接字连接,调用服务,最后关闭连接。 示例代码中的异常捕获块仅捕获Apache Thrift异常,并将其显示在Web服务器的错误日志中。 PHP错误通常在Web服务器的上下文中在服务器端表现出来。调试PHP程序的基本方法是检查Web服务器的错误日志。在Ubuntu 16.04系统中

AWSLambda冷启动问题全解析

### AWS Lambda 冷启动问题全解析 #### 1. 冷启动概述 在 AWS Lambda 中,冷启动是指函数实例首次创建时所经历的一系列初始化步骤。一旦函数实例创建完成,在其生命周期内不会再次经历冷启动。如果在代码中添加构造函数或静态初始化器,它们仅会在函数冷启动时被调用。可以在处理程序类的构造函数中添加显式日志,以便在函数日志中查看冷启动的发生情况。此外,还可以使用 X-Ray 和一些第三方 Lambda 监控工具来识别冷启动。 #### 2. 冷启动的影响 冷启动通常会导致事件处理出现延迟峰值,这也是人们关注冷启动的主要原因。一般情况下,小型 Lambda 函数的端到端延迟

JavaEE7中的MVC模式及其他重要模式解析

### Java EE 7中的MVC模式及其他重要模式解析 #### 1. MVC模式在Java EE中的实现 MVC(Model-View-Controller)模式是一种广泛应用于Web应用程序的设计模式,它将视图逻辑与业务逻辑分离,带来了灵活、可适应的Web应用,并且允许应用的不同部分几乎独立开发。 在Java EE中实现MVC模式,传统方式需要编写控制器逻辑、将URL映射到控制器类,还需编写大量的基础代码。但在Java EE的最新版本中,许多基础代码已被封装好,开发者只需专注于视图和模型,FacesServlet会处理控制器的实现。 ##### 1.1 FacesServlet的

在线票务系统解析:功能、流程与架构

### 在线票务系统解析:功能、流程与架构 在当今数字化时代,在线票务系统为观众提供了便捷的购票途径。本文将详细解析一个在线票务系统的各项特性,包括系统假设、范围限制、交付计划、用户界面等方面的内容。 #### 系统假设与范围限制 - **系统假设** - **Cookie 接受情况**:互联网用户不强制接受 Cookie,但预计大多数用户会接受。 - **座位类型与价格**:每场演出的座位分为一种或多种类型,如高级预留座。座位类型划分与演出相关,而非个别场次。同一演出同一类型的座位价格相同,但不同场次的价格结构可能不同,例如日场可能比晚场便宜以吸引家庭观众。 -

Clojure多方法:定义、应用与使用场景

### Clojure 多方法:定义、应用与使用场景 #### 1. 定义多方法 在 Clojure 中,定义多方法可以使用 `defmulti` 函数,其基本语法如下: ```clojure (defmulti name dispatch-fn) ``` 其中,`name` 是新多方法的名称,Clojure 会将 `dispatch-fn` 应用于方法参数,以选择多方法的特定实现。 以 `my-print` 为例,它接受一个参数,即要打印的内容,我们希望根据该参数的类型选择特定的实现。因此,`dispatch-fn` 需要是一个接受一个参数并返回该参数类型的函数。Clojure 内置的

并发编程:多语言实践与策略选择

### 并发编程:多语言实践与策略选择 #### 1. 文件大小计算的并发实现 在并发计算文件大小的场景中,我们可以采用数据流式方法。具体操作如下: - 创建两个 `DataFlowQueue` 实例,一个用于记录活跃的文件访问,另一个用于接收文件和子目录的大小。 - 创建一个 `DefaultPGroup` 来在线程池中运行任务。 ```plaintext graph LR A[创建 DataFlowQueue 实例] --> B[创建 DefaultPGroup] B --> C[执行 findSize 方法] C --> D[执行 findTotalFileS

设计与实现RESTfulAPI全解析

### 设计与实现 RESTful API 全解析 #### 1. RESTful API 设计基础 ##### 1.1 资源名称使用复数 资源名称应使用复数形式,因为它们代表数据集合。例如,“users” 代表用户集合,“posts” 代表帖子集合。通常情况下,复数名词表示服务中的一个集合,而 ID 则指向该集合中的一个实例。只有在整个应用程序中该数据类型只有一个实例时,使用单数名词才是合理的,但这种情况非常少见。 ##### 1.2 HTTP 方法 在超文本传输协议 1.1 中定义了八种 HTTP 方法,但在设计 RESTful API 时,通常只使用四种:GET、POST、PUT 和

响应式Spring开发:从错误处理到路由配置

### 响应式Spring开发:从错误处理到路由配置 #### 1. Reactor错误处理方法 在响应式编程中,错误处理是至关重要的。Project Reactor为其响应式类型(Mono<T> 和 Flux<T>)提供了六种错误处理方法,下面为你详细介绍: | 方法 | 描述 | 版本 | | --- | --- | --- | | onErrorReturn(..) | 声明一个默认值,当处理器中抛出异常时发出该值,不影响数据流,异常元素用默认值代替,后续元素正常处理。 | 1. 接收要返回的值作为参数<br>2. 接收要返回的值和应返回默认值的异常类型作为参数<br>3. 接收要返回