为了账号安全,请及时绑定邮箱和手机立即绑定

JDK9新特性资料详解:初学者必看教程

标签:
Java JVM
概述

本文详细介绍了JDK9的新特性,包括模块化系统、新的集合工厂方法、改进的HTTP客户端以及移除的废弃API等,旨在帮助开发者更好地理解和使用JDK9。文章还涵盖了针对移动设备的优化和并发改进等方面的实用特性,提供了丰富的示例代码以便读者深入理解。JDK9新特性资料将帮助开发者提高Java程序的性能、可维护性和安全性。

JDK9新特性资料详解:初学者必看教程
JDK9简介

JDK9是Java开发工具包(Java Development Kit,JDK)的第九个主要版本,于2017年9月21日发布。该版本引入了一些重要的新特性和改进,旨在提高Java程序的性能、可维护性以及安全性。

JDK9版本亮点

  • 模块化系统:JDK9最引人注目的新特性之一是引入了模块化系统(Project Jigsaw),这使得Java程序的开发和部署变得更加灵活、高效。
  • 新的集合工厂方法:JDK9提供了一系列新的工厂方法来创建集合,简化了集合的创建过程。
  • 改进的HTTP客户端:支持HTTP/2协议,提高了Web应用程序的性能。
  • 移除的废弃API:移除了许多已经不再使用的API,为Java平台瘦身。
  • 其他特性:包括对移动设备的优化、并发改进等。
模块化系统(Jigsaw项目)

模块化系统简介

模块化系统是JDK9中最重要的新特性之一。它通过引入module关键字,使开发者能够定义程序的模块,每个模块都包含一组类和资源,并可以声明对其他模块的依赖。这种模块化的方式不仅有助于提高程序的可维护性,还能减少应用程序的启动时间和内存使用。

模块化系统的好处

  • 减少冗余代码:通过定义模块边界,可以避免重复的代码和资源。
  • 明确依赖:每个模块可以清晰地声明它依赖的其他模块,有助于解决依赖管理问题。
  • 提高安全性:模块化系统可以限制模块之间的访问,从而减少潜在的代码注入攻击面。
  • 简化部署:模块化系统使得部署更加简单,各模块可以独立部署和更新,而不会影响其他模块。

如何定义模块

模块是通过在源代码目录的顶层添加一个叫做module-info.java的特殊源文件来定义的。以下是一个简单的模块定义的示例代码:

module com.example.myapp {
    // 此模块需要使用java.base模块
    requires java.base;

    // 此模块需要使用java.logging模块
    requires java.logging;

    // 此模块提供main方法
    exports com.example.myapp;
}

如上代码所示,模块定义包含以下部分:

  • module关键字:指定了这是模块定义。
  • com.example.myapp:是模块的名称。
  • requires:指定了此模块依赖的其他模块。
  • exports:指定了哪些包中的类可以被其他模块访问。

定义模块后,可以使用--module-path--add-modules选项来编译和运行模块化程序。以下是一个具体的编译和运行示例:

javac --module-path mods --add-modules java.base,com.example.myapp -d mods com/example/myapp/*.java
java --module-path mods --add-modules com.example.myapp com.example.myapp.Main

移动设备优化

JDK9引入了一些针对移动设备的优化,例如改进了垃圾收集器的行为,使得程序在移动设备上运行时更加流畅。此外,JDK9还引入了 java.base 模块的子模块 java.base.mobile,该子模块提供了专门为移动设备优化的类和接口。以下是一个简单的示例代码,展示了如何使用这些优化:

import java.util.concurrent.ThreadLocalRandom;

public class MobileOptimizationExample {
    public static void main(String[] args) {
        // 使用ThreadLocalRandom生成随机数
        int randomNum = ThreadLocalRandom.current().nextInt(100);
        System.out.println("Random Number: " + randomNum);
    }
}

并发改进

JDK9在并发方面也有一些改进。例如,引入了 ThreadLocalRandom 类来生成线程局部的随机数,这对于多线程环境下的随机数生成非常有用。此外,JDK9还改进了 ConcurrentHashMap 的内部实现,使得并发操作更加高效。以下是一个使用 ThreadLocalRandom 的示例代码:

import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentImprovementExample {
    public static void main(String[] args) {
        // 使用ThreadLocalRandom生成随机数
        int randomNum = ThreadLocalRandom.current().nextInt(100);
        System.out.println("Random Number: " + randomNum);

        // 使用ConcurrentHashMap进行并发操作
        ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
        map.put("Example", randomNum);
        System.out.println("Stored Random Number: " + map.get("Example"));
    }
}
新的集合工厂方法

新的集合工厂方法介绍

JDK9引入了一系列新的工厂方法,使得创建集合变得更为简洁和高效。这些方法位于java.util包下的各个集合类中,例如ListSetMap等。

使用示例

以下是使用新的工厂方法创建集合的示例代码:

import java.util.List;
import java.util.Set;
import java.util.Map;

public class NewCollectionFactoryMethods {
    public static void main(String[] args) {
        // 创建一个空的List
        List<String> emptyList = List.of();

        // 创建一个包含元素的List
        List<String> list = List.of("Apple", "Banana", "Cherry");

        // 创建一个不可变的Set
        Set<String> set = Set.of("Red", "Green", "Blue");

        // 创建一个不可变的Map
        Map<String, Integer> map = Map.of("one", 1, "two", 2, "three", 3);

        // 输出集合内容
        System.out.println("List: " + list);
        System.out.println("Set: " + set);
        System.out.println("Map: " + map);
    }
}

输出:

List: [Apple, Banana, Cherry]
Set: [Red, Green, Blue]
Map: {one=1, two=2, three=3}

新的工厂方法简化了集合的创建过程,并且创建的集合是不可变的,这有助于提高程序的安全性和性能。

进步的HTTP客户端

HTTP/2支持

JDK9中的HTTP客户端库支持HTTP/2协议,这是相对于之前的HTTP/1.1协议的一个重大改进。HTTP/2提供了更好的性能,支持多路复用、数据压缩、服务器推送等功能,使得Web应用程序的响应速度更快。

如何使用新的HTTP客户端

以下是使用新的HTTP客户端库发送HTTP请求的示例代码:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class HttpClientExample {
    public static void main(String[] args) throws Exception {
        // 创建HttpClient实例
        HttpClient client = HttpClient.newHttpClient();

        // 创建请求
        HttpRequest request = HttpRequest.newBuilder()
            .uri(new URI("https://example.com"))
            .GET()
            .build();

        // 发送请求并获取响应
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

        // 输出响应内容
        System.out.println("Response Body: " + response.body());
    }
}

输出:

Response Body: <html>...</html>

使用新的HTTP客户端库可以简化HTTP请求的发送过程,并且支持HTTP/2协议,提高了Web应用程序的性能。

移除废弃API

移除的API列表

JDK9移除了许多已经不再使用的API,这些API大多在早期版本中就已经标记为废弃。以下是一些被移除的API:

  • java.util.jar.JarFile.getManifest()
  • java.awt.font.TextAttribute.getLocalizedValue()
  • java.util.logging.Handler.publish()
  • sun.misc.Unsafe(部分功能)
  • javax.xml.rpc.* 包中的所有类和接口
  • sun.reflect.annotation.AnnotationInvocationHandler 和相关类
  • java.awt.Robot 类中的 keyPresskeyRelease 方法

使用替代方案

对于移除的API,开发者可以通过以下方式找到替代方案:

  • java.util.jar.JarFile.getManifest():可以使用 JarFile.getManifest() 的替代方法 new Manifest(JarFile.getInputStream(new Manifest(mf).getMainAttributes().getValue("Main-Class")))

    public Manifest getMainManifestFromJarFile(JarFile jarFile) {
      return new Manifest(jarFile.getInputStream(jarFile.getManifest()));
    }
  • java.awt.font.TextAttribute.getLocalizedValue():可以使用 java.util.Locale 类来实现本地化。

    import java.util.Locale;
    import java.awt.font.TextAttribute;
    
    public String getLocalizedValue(String key, Locale locale) {
      return key + " in " + locale.toString();
    }
  • java.util.logging.Handler.publish():可以使用 Logger 类的 log() 方法。

    import java.util.logging.Logger;
    import java.util.logging.Level;
    
    public void logMessage(String message) {
      Logger logger = Logger.getLogger("MyLogger");
      logger.log(Level.INFO, message);
    }
  • sun.misc.Unsafe:可以使用 java.lang.instrument.Instrumentation 类来实现更安全的操作。

    import java.lang.instrument.Instrumentation;
    
    public class InstrumentationExample {
      public static void premain(String args, Instrumentation inst) {
          System.out.println("Instrumentation is active!");
      }
    }
  • *`javax.xml.rpc.**:可以使用javax.xml.ws包中的新类来替代旧的javax.xml.rpc` 包。

    import javax.xml.ws.Service;
    import javax.xml.ws.WebServiceException;
    
    public class WebServiceClient {
      public static void main(String[] args) {
          Service service = Service.create(new URL("http://example.com/Service"));
          // 获取服务接口实例
          // Service service = Service.create(new URL("http://example.com/Service"), SERVICE_QNAME);
      }
    }
  • sun.reflect.annotation.AnnotationInvocationHandler:可以使用标准的 java.lang.annotation 包中的注解类。

    import java.lang.annotation.Annotation;
    
    public static Annotation getAnnotation(Class<?> clazz, Class<? extends Annotation> annotationClass) {
      return clazz.getAnnotation(annotationClass);
    }
  • java.awt.Robot:可以使用 java.awt.Robot 类中的其他方法来替代 keyPresskeyRelease 方法。

    import java.awt.Robot;
    import java.awt.event.KeyEvent;
    
    public class RobotExample {
      public static void main(String[] args) throws Exception {
          Robot robot = new Robot();
          robot.keyPress(KeyEvent.VK_A);
          robot.keyRelease(KeyEvent.VK_A);
      }
    }

通过这些新的特性和改进,JDK9为开发者提供了更强大的工具和更高效的编程环境。希望本文对学习JDK9的新特性有所帮助。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消