java9新特性

进程API

java进程api是很基础的操作,包括重启一个进程,重定向进程的输出和错误流。这个版本中的进程API允许下面的操作:
● 获得当前JVM进程或者由此进程衍生的进程的PID
● 枚举系统中所有进程的信息,包括PID,名称和资源使用情况
● 管理进程树
● 管理子进程

看下面一个简单例子,打印当前进程PID和信息:

ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("pid:"+currentProcess.pid());

ProcessHandle.Info currentProcessInfo = currentProcess.info();
System.out.println("Info: " + currentProcessInfo);

HTTP/2

java的HTTPAPI也是很常用的。开发者们主要是使用一些第三方的库,比如:Apache HTTP。RESTlet,Jersey等。另外java之前的HTTP API 是HTTP/1.1版本,而且是同步且难以维护的,这些限制因素导致产生了现在的新的API。新的API提供下面的功能:
● 简单的API处理大部分的HTTP请求
● 支持HTTP/2标准
● 更好的性能

下面是一个简单的代码写了一个HTTP GET请求。新API在模块jdk.incubator.httpclient中所以我们需要导入这个模块。关于模块的概念以及用法我们之后的章节中会讲到,现在你只需要知道其他模块中的代码只有引入当前模块后,才能使用。在module-info.java中引入,如下:

//module-info.java
module newfeatures{
    requires jdk.incubator.httpclient;
}

下面是具体代码:

import jdk.incubator.http.*;
import java.net.URI;
public class Http2Feature{
    public static void main(String[] args) throws Exception{
        HttpClient client = HttpClient.newBuilder().build();
        HttpRequest request = HttpRequest
        .newBuilder(new URI("http://httpbin.org/get"))
        .GET()
        .version(HttpClient.Version.HTTP_1_1)
        .build();
        HttpResponse<String> response = client.send(request,
        HttpResponse.BodyHandler.asString());
        System.out.println("Status code: " + response.statusCode());
        System.out.println("Response Body: " + response.body());
    }
}

多种语法糖

1:JavaSE 7中下划线可以用来分割数字,尤其是当数字非常大的时候。这可以方便我们阅读,就像下面的代码这样:
Integer large_Number = 123_123_123;
System.out.println(large_Number);

2:Java SE 8中,在变量名中可以存在下划线,但是会产生一个警告,但是在JavaSE9中,这是不允许的。也就是说java9中变量名字中不允许出现下划线。

3:支持接口中的私有方法。

4:try-with-resources也有所改变java8中我们这么使用,如下:

try(Connection conn = getConnection()){}catch(Exception ex){}.

java9中我们可以向下面这样:

try(conn){}catch(Exception ex){}

当前conn在之前进行声明和定义,应该是final的。

Jshell -RPEL

你应该见过一些语言可以在命令行进行交互式编程。比如Ruby,Scala等,RPEL特性可以让人很快的了解语言的特性。比如Scala,我们可以想下面这样写一个hello world程序:

scala> println("Hello World");

JShell REPL的有点如下:
● 快速了解语言特性
● 帮助有经验的开发者快速的设计代码原型
● java开发者可以和其他人吹牛

下面我们使用Jshell 写个hello world程序:

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

jshell> String str = "hello world";
str ==> "hello world"

jshell> System.out.println(str);
hello world

jshell>

多版本jar文件

现在的jar文件只能运行在它们编译时的java版本中。为了使用新版本的新特性,一般都需要重新发布新的库。这样就导致了开发者需要同时维护多个版本的库,这是一个噩梦。为了克服这个限制,多版本jar允许开发者在同一个库中使用多个Java版本来构建不同的类文件。就像下面这样:

老的jar文件如下格式:

jar root
    - A.class
    - B.class
    - C.class

多版本jar文件格式如下:

jar root
    - A.class
    - B.class
    - C.class
    - META-INF
        - versions
        - 9
            - A.class
        - 10
            - B.class

高并发更新

提供了类java.util.concurrent.Flow。这个类提供了发布订阅功能。可以异步方式进行数据处理。内部接口如下:
● java.util.concurrent.Flow.Publisher
● java.util.concurrent.Flow.Subscriber
● ava.util.concurrent.Flow.Subscription
● java.util.concurrent.Flow.Processor

Jigsaw项目

这个项目就是java9最大的更新:模块化。对于模块化的使用我们后面的章节讨论。模块化的好处如下:
● 更强的封装:之前的版本中public修饰的类是任何地方都可访问的。但模块化之后将改变这一情况。模块和模块之间的可访问性我们叫做可见性。可以通过exports和requires来实现模块之间的访问。
● 更简单的依赖
● 通过模块我们可以使用更小的运行时环境,去掉我们不需要的模块。再也没有rt.jar。这个jar有60多M。
● 消除运行时错误,让项目更稳定,更可靠。

这个项目是非常复杂的,它包括以下几个项目:
● 模块化JDK
● 模块化源码
● 模块化运行时图像
● 封装API
● 模块系统:对关键字requires, exports, opens和 uses.的支持
● Jlink:帮我们打造一个更小的运行时环境

还有一些其他的更新如下:
● javadoc生成HTML5
● G1作为默认的垃圾收集器
● 改变String内部的char数组为byte数组
● 新的stack跟踪
● image/IO支持TIFF格式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值