java9新特性
进程APIjava进程api是很基础的操作,包括重启一个进程,重定向进程的输出和错误流。这个版本中的进程API允许下面的操作:● 获得当前JVM进程或者由此进程衍生的进程的PID● 枚举系统中所有进程的信息,包括PID,名称和资源使用情况● 管理进程树● 管理子进程看下面一个简单例子,打印当前进程PID和信息:ProcessHandle currentP
进程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格式
更多推荐
所有评论(0)