本文提供了JDK9新特性教程,涵盖了模块化系统、新的HTTP客户端API以及移除和弃用的API等内容,旨在帮助初学者快速入门。文章还介绍了其他重要特性,如新的集合类型和改进的垃圾回收器,全面解读了JDK9带来的多种改进和优化。通过这些内容,读者可以深入了解JDK9的新特性并学习如何在实际开发中应用它们。
Java Development Kit (JDK) 9是Java平台标准版的第九个主要发行版本,于2017年9月21日正式发布。JDK 9代表了Java平台的重要更新,引入了多项新特性和优化,旨在提高Java应用程序的性能、安全性、可维护性及可移植性。
模块化系统是Java平台的一个重要更新,它通过在编译时指定模块之间的依赖关系来提高应用程序的可维护性和安全性。每个模块都包含一组相关的类和接口,并且模块之间可以明确声明它们的依赖关系。这使得开发更清晰、更可维护的代码库成为可能。
模块化系统的使用方法包括定义模块、声明模块依赖以及在模块路径中指定模块文件。以下是如何定义模块的步骤:
module-info.java
)定义,该文件位于模块的源代码根目录中。module-info.java
文件中,模块可以声明对其他模块的依赖,这些依赖可以是直接的,也可以是间接的。例如:
module com.example.demo { requires java.base; requires java.logging; exports com.example.demo; }
模块定义的示例如下:
module com.example.myapp { requires java.base; requires java.logging; exports com.example.myapp; }
这里,com.example.myapp
是模块的名称,requires
关键字声明该模块依赖于java.base
和java.logging
模块,而exports
关键字声明模块的包可以被其他模块访问。
旧的HTTP客户端API基于java.net
包中的HttpURLConnection
类实现,这种实现方式有许多限制:
HttpURLConnection
编程较复杂,需要处理连接、请求、响应的多个步骤。新的HTTP客户端API是一种HttpClient
,它基于连接器模式实现,其主要优势包括:
以下是一个简单的示例,展示了如何使用新的HTTP客户端API发送GET请求并处理响应:
import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; import java.net.http.HttpResponse.BodyHandlers; import java.util.concurrent.CompletableFuture; public class HttpClientExample { public static void main(String[] args) throws Exception { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(new URI("https://api.example.com/data")) .GET() .build(); CompletableFuture<HttpResponse<String>> responseFuture = client.sendAsync(request, BodyHandlers.ofString()); responseFuture.thenApply(response -> response.body()) .thenAccept(System.out::println) .join(); } }
此代码首先创建了一个HttpClient
实例,然后构建了一个GET请求,并通过sendAsync
方法异步发送请求。响应处理通过CompletableFuture
的链式调用来完成。
JDK 9移除了多个旧的、不常用的API,例如:
com.sun.deploy.*
包com.sun.javaws.*
包com.sun.media.sound.*
包sun.awt.*
包sun.audio.*
包sun.beans.*
包sun.font.*
包sun.java2d.*
包sun.io.*
包sun.jndi.*
包sun.management.*
包sun.misc.*
包sun.nio.ch.*
包sun.net.*
包sun.security.*
包sun.swing.*
包sun.text.*
包sun.tools.*
包sun.util.*
包sun.xml.*
包sun.awt.windows.*
包sun.java.*
包sun.swing.table.*
包sun.text.resources.*
包sun.util.locale.provider.*
包JDK 9还弃用了一些API,例如:
java.util.jar.Manifest
中的Attributes.Name
字段Main-Class
和Class-Path
。java.lang.ClassLoader
中的getPackage
和definePackage
方法。java.lang.Class
中的getPackage
方法。java.lang.String
中的intern
方法。java.lang.Deprecated
注解。java.io.Console
中的readLine
方法。java.util.Random
中的nextBytes
方法。java.lang.ProcessBuilder
中的start
方法。移除和弃用API的影响包括:
例如,如果有一个旧的代码示例使用了被移除的API,可以展示如何重构或替换这部分代码:
// 假设原来的代码如下 import com.sun.deploy.net.HttpRequest; import com.sun.deploy.net.HttpResponse; import java.net.URI; public class OldHttpClientExample { public static void main(String[] args) { HttpRequest request = new HttpRequest(new URI("https://api.example.com/data")); HttpResponse response = request.send(); System.out.println(response.getBody()); } } // 重构为新的HTTP客户端API import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.util.concurrent.CompletableFuture; public class NewHttpClientExample { public static void main(String[] args) throws Exception { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(new URI("https://api.example.com/data")) .GET() .build(); CompletableFuture<HttpResponse<String>> responseFuture = client.sendAsync(request, BodyHandlers.ofString()); responseFuture.thenApply(response -> response.body()) .thenAccept(System.out::println) .join(); } }
JDK 9引入了多项重要的新特性,包括但不限于:
List
、Set
和Map
接口现在都有默认实现。@Deprecated
注解现在可以用于方法和类。jlink
工具允许构建自定义的JRE,jmod
工具用于管理模块文件,jdeps
工具用于分析模块依赖关系。这些新特性的引入改善了开发体验,例如:
以下是一些新的特性的实际应用场景示例:
使用新的集合类型:在开发过程中,可以直接使用新的集合类型,而不需要自己实现这些类型。
List<String> list = List.of("item1", "item2", "item3"); Set<String> set = Set.of("item1", "item2", "item3"); Map<String, String> map = Map.of("key1", "value1", "key2", "value2");
使用新的注解:在代码中使用新的注解来标记不建议使用的API。
@Deprecated public void oldMethod() { // 旧方法的实现 }
public class MyApp { public static void main(String[] args) { // 应用程序的主逻辑 } }
JDK 9引入了模块化系统、新的HTTP客户端API、移除和弃用的API以及多项其他新特性。这些更新改善了Java应用程序的性能、安全性、可维护性及可移植性,并为开发人员提供了更多工具和功能来构建更高效、更安全的应用程序。
学习JDK 9新特性的方法包括: