JDK 9.0 新特性

一、JDK 9.0 下载

官网地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.htmlhtml

二、JDK 9.0 安装

(1)安装
“下一步”安装便可。
(2)配置环境变量
直接在Path中添加”C:\Program Files\Java\jdk-9\bin;”。
(3)安装验证
CMD中验证:java

--> java -version java version "9" Java(TM) SE Runtime Environment (build 9+181) Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)

三、JDK 9.0 代码编写

(1)模块化管理
建立基本的java项目,目录结构以下:web

--java9_pro\lib  -->打包成模块化的jar
--java9_pro\mods -->已编译的代码
--java9_pro\src  -->存放源码

(2)编写源代码
编写module-info.java(存放在src\com.zmzy.module):shell

module com.zmzy.module {
    requires java.management;
    requires jdk.incubator.httpclient;
}

建立Java类(存放在src\com.zmzy.module\com\zmzy\module):oracle

package com.zmzy.module.com.zmzy.module;

public class HelloModule {
    public static void main(String[] args) {
        System.out.println("Hello Module!");
        //获取Module对象
        Module mod =  HelloModule.class.getModule();
        //获取类所在的模块名称
        String modName = mod.getName();
        //System.out.println("模块名称:"+ modName);
        System.out.format("模块名称:%s%n",modName);
    }
}

(3)编译模块化程序
1.  定位到源码目录:app

cd D:\pd_workspaces\java9_pro

2.  使用javac命令进行编译(注意中文编码):svg

`D:\pd_workspaces\java9_pro>javac -d mods --module-source-path src 
-encoding UTF-8 
src\com.zmzy.module\module-info.java 
src\com.zmzy.module\com\zmzy\module\HelloModule.java`

命令的含义:
-d mods :编译后文件保存的目录;
--module-source-path src :包含多个模块的源代码;
-encoding UTF-8 :指定编码方式。
(4)打包
使用jar进行打包:模块化

`D:\pd_workspaces\java9_pro>jar --create --file lib/mymodule-1.0.jar 
--main-class com.zmzy.module.com.zmzy.module.HelloModule 
-C mods/com.zmzy.module .`

(5)运行
使用java命令运行程序:单元测试

`D:\pd_workspaces\java9_pro>java --module-path lib 
--module com.zmzy.module/com.zmzy.module.com.zmzy.module.HelloModule`

Hello Module!
模块名称:com.zmzy.module

四、JDK 9.0 新特性

(1)JShell
相似于Scala、Python、R语言,无需javac java,不用写单元测试。
1.  进入JShell:测试

`C:\Users\zmzy>jshell`
| 欢迎使用 JShell -- 版本 9
| 要大体了解该版本, 请键入: /help intro

2.  使用JShell:

jshell> System.out.println("Hello JShell!");
Hello JShell!

jshell> int num = 10
num ==> 10

jshell> num
num ==> 10

jshell> "I Like Java !".substring(2,6)
$4 ==> "Like"

jshell> for(int i=0;i<10;i++){
   ...> System.out.println(i);
   ...> }
0
1
2
3
4
5
6
7
8
9

(2)Process API
获取PID方式一:

package com.zmzy.module.com.zmzy.module;

import java.lang.management.ManagementFactory;

public class GetPID01 {
    public static void main(String[] args) {
       //Runtime.getRuntime().exec("")
       String name =  ManagementFactory.getRuntimeMXBean().getName();
       System.out.println(name);
       //获取PID
       String pid = name.split("@")[0];
       System.out.println("PID:"+pid);
    }
}

获取PID方式二:

package com.zmzy.module.com.zmzy.module;

public class GetPID02 {
    public static void main(String[] args) {
        ProcessHandle ph =  ProcessHandle.current();
        long pid =  ph.pid();
        System.out.println("PID:"+pid);
    }
}

(3)集合方法

package com.zmzy.module.com.zmzy.module;

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

public class MyCollections {
    public static void main(String[] args) {
        //建立List集合并填充元素
        /*List<String> list = new ArrayList<>(); list.add("zhangsan"); list.add("小明");*/

        List<String> list = List.of("zhangsan","小明");
        System.out.println(list);

        Map<String,Integer> map = Map.of("num1",1,"num2",100);
        System.out.println(map);

        Set<String> set =  Set.of("apple","orange","pair");
        System.out.println(set);
    }
}

(4)接口私有化方法

package com.zmzy.module.com.zmzy.module;

public interface PrivateInterface {
    void sayHello();  //普通写法

    default void show(){  //java 8的使用方式
        System.out.println("Show Info");
        print();
    }

    private void print(){  //Java 9的使用方式
        System.out.println("Hello!");
    }
}

接口私有化方法解决了JDK 8.0 中默认方法不能是私有的,使用私有接口方法主要用于构建默认方法开发API。
(5)Http协议API
1.  替代了以前”HttpURLConnection”;
2.  提供支持WebSocket。

package com.zmzy.module.com.zmzy.module;

import jdk.incubator.http.HttpClient;
import jdk.incubator.http.HttpRequest;
import jdk.incubator.http.HttpResponse;
import java.io.IOException;
import java.net.URI;

public class MyHttpClient {
    public static void main(String[] args) {
        HttpClient hc = HttpClient.newHttpClient();
        //建立HttpRequest
        HttpRequest req = HttpRequest.newBuilder(URI.create("http://www.baidu.com")).GET().build();
        try {
            HttpResponse<String> resp = hc.send(req, HttpResponse.BodyHandler.asString());
            System.out.println(resp);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

(6)提供了处理JSON文本API (7)移除已经被JDK 8.0 标记为过时的了GCC回收器