Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
apachecn-java-zh
提交
4c8c6d85
A
apachecn-java-zh
项目概览
OpenDocCN
/
apachecn-java-zh
11 个月 前同步成功
通知
5
Star
53
Fork
13
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
apachecn-java-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
4c8c6d85
编写于
5月 12, 2021
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2021-05-12 22:11:27
上级
f1e71311
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
69 addition
and
69 deletion
+69
-69
new/java-proj/6.md
new/java-proj/6.md
+1
-1
new/java-proj/8.md
new/java-proj/8.md
+1
-1
new/learn-java12-prog/12.md
new/learn-java12-prog/12.md
+1
-1
new/master-java11/02.md
new/master-java11/02.md
+6
-6
new/master-java11/12.md
new/master-java11/12.md
+11
-11
new/master-java11/13.md
new/master-java11/13.md
+28
-28
new/master-java11/14.md
new/master-java11/14.md
+6
-6
new/master-java11/15.md
new/master-java11/15.md
+7
-7
new/master-java11/16.md
new/master-java11/16.md
+4
-4
new/master-java11/17.md
new/master-java11/17.md
+2
-2
new/master-java11/18.md
new/master-java11/18.md
+2
-2
未找到文件。
new/java-proj/6.md
浏览文件 @
4c8c6d85
...
@@ -299,7 +299,7 @@ public class HelloWorld extends HttpServlet {
...
@@ -299,7 +299,7 @@ public class HelloWorld extends HttpServlet {
当 Servlet 容器通过
`GET`
方法获得 HTTP 请求时,
`doGet`
方法被调用。该方法有两个参数。第一个代表请求,第二个代表响应。
`request`
可以用来收集请求中的所有信息。在前面的例子中,没有这样的。我们不使用任何输入。如果一个请求到达我们的 Servlet,那么不管发生什么,我们都会回答
`Hello, World`
字符串。稍后,我们将看到从请求中读取参数的示例。
`response`
给出了可以用来处理输出的方法。
当 Servlet 容器通过
`GET`
方法获得 HTTP 请求时,
`doGet`
方法被调用。该方法有两个参数。第一个代表请求,第二个代表响应。
`request`
可以用来收集请求中的所有信息。在前面的例子中,没有这样的。我们不使用任何输入。如果一个请求到达我们的 Servlet,那么不管发生什么,我们都会回答
`Hello, World`
字符串。稍后,我们将看到从请求中读取参数的示例。
`response`
给出了可以用来处理输出的方法。
在本例中,我们获取
`PrintWriter`
,它将用于向 HTTP 响应的主体发送字符。这是显示在浏览器中的内容。我们发送的
mime
类型是
`text/html`
,这是通过调用
`setContentType`
方法来设置的。这将进入 HTTP 头字段
`Content-Type`
。这些类的标准和 JavaDoc 文档定义了可以使用的所有方法,以及应该如何使用这些方法。
在本例中,我们获取
`PrintWriter`
,它将用于向 HTTP 响应的主体发送字符。这是显示在浏览器中的内容。我们发送的
MIME
类型是
`text/html`
,这是通过调用
`setContentType`
方法来设置的。这将进入 HTTP 头字段
`Content-Type`
。这些类的标准和 JavaDoc 文档定义了可以使用的所有方法,以及应该如何使用这些方法。
最后,我们有一个
`web.xml`
文件,它声明了代码中实现的 Servlet。正如文件名所示,这是一个 XML 文件。它声明性地定义了存档中包含的所有 Servlet 以及其他参数。在下面的示例中,没有定义参数,只有 Servlet 和到 URL 的映射。因为在这个例子中我们只有一个 Servlet,WAR 文件,所以它被映射到根上下文。到达 Servlet 容器和此存档的每个
`GET`
请求都将由此 Servlet 提供服务:
最后,我们有一个
`web.xml`
文件,它声明了代码中实现的 Servlet。正如文件名所示,这是一个 XML 文件。它声明性地定义了存档中包含的所有 Servlet 以及其他参数。在下面的示例中,没有定义参数,只有 Servlet 和到 URL 的映射。因为在这个例子中我们只有一个 Servlet,WAR 文件,所以它被映射到根上下文。到达 Servlet 容器和此存档的每个
`GET`
请求都将由此 Servlet 提供服务:
...
...
new/java-proj/8.md
浏览文件 @
4c8c6d85
...
@@ -1183,7 +1183,7 @@ function isInconsistent(order){
...
@@ -1183,7 +1183,7 @@ function isInconsistent(order){
它使用服务提供者规范来实现这一点,服务提供者规范很长时间以来一直是 JDK 的一部分,而且通过 Java9,它还获得了模块处理方面的额外支持。这要求脚本解释器实现
`ScriptEngineFactory`
接口,并在
`META-INF/services/javax.script.ScriptEngineFactory`
文件中列出执行该接口的类。这些文件,从属于类路径的所有 JAR 文件中,作为资源被
`ScriptEngineManager`
读取,通过它,它知道哪些类实现了脚本解释器。
`ScriptEngineFactory`
接口要求口译员提供
`getNames()`
、
`getExtensions()`
、
`getMimeTypes()`
等方法。经理调用这些方法来收集有关口译员的信息。当我们询问 JavaScript 解释器时,经理会返回工厂创建的名称,其中一个名称是
`JavaScript`
。
它使用服务提供者规范来实现这一点,服务提供者规范很长时间以来一直是 JDK 的一部分,而且通过 Java9,它还获得了模块处理方面的额外支持。这要求脚本解释器实现
`ScriptEngineFactory`
接口,并在
`META-INF/services/javax.script.ScriptEngineFactory`
文件中列出执行该接口的类。这些文件,从属于类路径的所有 JAR 文件中,作为资源被
`ScriptEngineManager`
读取,通过它,它知道哪些类实现了脚本解释器。
`ScriptEngineFactory`
接口要求口译员提供
`getNames()`
、
`getExtensions()`
、
`getMimeTypes()`
等方法。经理调用这些方法来收集有关口译员的信息。当我们询问 JavaScript 解释器时,经理会返回工厂创建的名称,其中一个名称是
`JavaScript`
。
为了通过名称访问解释器,文件扩展名或
mime
类型只是
`ScriptEngineManager`
的函数之一。另一个是管理
`Bindings`
。
为了通过名称访问解释器,文件扩展名或
MIME
类型只是
`ScriptEngineManager`
的函数之一。另一个是管理
`Bindings`
。
当我们在 Java 代码中执行一个脚本时,我们不会这样做,因为我们想增加多巴胺的水平。在脚本的情况下,它不会发生。我们想要一些结果。我们希望传递参数,并且在脚本执行之后,我们希望从脚本中获得可以在 Java 代码中使用的值。这可以通过两种方式实现。一种是将参数传递给脚本中实现的方法或函数,并从脚本中获取返回值。这通常是可行的,但有些脚本语言甚至可能没有函数或方法的概念。在这种情况下,这是不可能的。可以将环境传递给脚本,并在脚本执行后从环境中读取值。这个环境用
`Bindings`
表示。
当我们在 Java 代码中执行一个脚本时,我们不会这样做,因为我们想增加多巴胺的水平。在脚本的情况下,它不会发生。我们想要一些结果。我们希望传递参数,并且在脚本执行之后,我们希望从脚本中获得可以在 Java 代码中使用的值。这可以通过两种方式实现。一种是将参数传递给脚本中实现的方法或函数,并从脚本中获取返回值。这通常是可行的,但有些脚本语言甚至可能没有函数或方法的概念。在这种情况下,这是不可能的。可以将环境传递给脚本,并在脚本执行后从环境中读取值。这个环境用
`Bindings`
表示。
...
...
new/learn-java12-prog/12.md
浏览文件 @
4c8c6d85
...
@@ -702,7 +702,7 @@ primaryStage.onCloseRequestProperty()
...
@@ -702,7 +702,7 @@ primaryStage.onCloseRequestProperty()
primaryStage.show();
primaryStage.show();
```
```
前面的代码创建一个`
WebView
`对象,从中获取`
WebEngine
`对象,使用获取的`
WebEngine
`对象加载 HTML,在场景中设置`
WebView
`对象,并配置舞台。`
loadContent()
`方法接受两个字符串:内容及其
mime
类型。内容字符串可以在代码中构造,也可以通过读取`
.html
`文件来创建
前面的代码创建一个`
WebView
`对象,从中获取`
WebEngine
`对象,使用获取的`
WebEngine
`对象加载 HTML,在场景中设置`
WebView
`对象,并配置舞台。`
loadContent()
`方法接受两个字符串:内容及其
MIME
类型。内容字符串可以在代码中构造,也可以通过读取`
.html
`文件来创建
如果我们运行前面的示例,结果如下:
如果我们运行前面的示例,结果如下:
...
...
new/master-java11/02.md
浏览文件 @
4c8c6d85
...
@@ -13,7 +13,7 @@ JEP 计划是 Oracle 支持开源、开放创新和开放标准的一部分。
...
@@ -13,7 +13,7 @@ JEP 计划是 Oracle 支持开源、开放创新和开放标准的一部分。
*
改进的争用锁
*
改进的争用锁
*
分段码缓存
*
分段码缓存
*
智能 Java 编译,第二阶段【JEP199】
*
智能 Java 编译,第二阶段【JEP199】
*
解决
lint 和 d
oclint 警告【JEP212】
*
解决
Lint 和 D
oclint 警告【JEP212】
*
Javac 的分层属性【JEP215】
*
Javac 的分层属性【JEP215】
*
注释管道 2.0【JEP217】
*
注释管道 2.0【JEP217】
*
新版本字符串方案
*
新版本字符串方案
...
@@ -112,13 +112,13 @@ Java 的分段代码缓存升级已经完成,结果是执行速度更快、效
...
@@ -112,13 +112,13 @@ Java 的分段代码缓存升级已经完成,结果是执行速度更快、效
Lint 和 Doclint 是向
`javac`
报告警告的来源。我们来看看每一个:
Lint 和 Doclint 是向
`javac`
报告警告的来源。我们来看看每一个:
*
Lint 分析
`javac`
的字节码和源代码。
lint 的目标是识别所分析代码中的安全漏洞。Lint 还可以深入了解可伸缩性和线程锁定问题。l
int 还有更多的功能,其总体目的是节省开发人员的时间。
*
Lint 分析
`javac`
的字节码和源代码。
Lint 的目标是识别所分析代码中的安全漏洞。Lint 还可以深入了解可伸缩性和线程锁定问题。L
int 还有更多的功能,其总体目的是节省开发人员的时间。
[
您可以在这里阅读更多关于
l
int 的信息
](
http://openjdk.java.net/jeps/212
)
。
[
您可以在这里阅读更多关于
L
int 的信息
](
http://openjdk.java.net/jeps/212
)
。
*
Doclint 与
lint 类似,是针对
`javadoc`
的。lint 和 d
oclint 都报告编译过程中的错误和警告。这些警告的解决是 JEP212 的重点。使用核心库时,不应出现任何警告。这种思维方式导致了 JEP212,它已经在 Java9 中得到了解决和实现。
*
Doclint 与
Lint 类似,是针对
`javadoc`
的。Lint 和 D
oclint 都报告编译过程中的错误和警告。这些警告的解决是 JEP212 的重点。使用核心库时,不应出现任何警告。这种思维方式导致了 JEP212,它已经在 Java9 中得到了解决和实现。
lint 和 d
oclint 警告的综合列表可以在
**JDK 错误系统**
(
**JBS**
)中查看,可在
[
这个页面
](
https://bugs.openjdk.java.net
)
中获得。
Lint 和 D
oclint 警告的综合列表可以在
**JDK 错误系统**
(
**JBS**
)中查看,可在
[
这个页面
](
https://bugs.openjdk.java.net
)
中获得。
# Javac 的分层属性
# Javac 的分层属性
...
@@ -796,7 +796,7 @@ Java9 平台由八个不同的存储库组成,如下图所示。在 Java10 中
...
@@ -796,7 +796,7 @@ Java9 平台由八个不同的存储库组成,如下图所示。在 Java10 中
1.
什么是知足锁?
1.
什么是知足锁?
2.
什么是代码缓存?
2.
什么是代码缓存?
3.
用于定义已分析编译方法的代码堆大小的命令行代码是什么?
3.
用于定义已分析编译方法的代码堆大小的命令行代码是什么?
4.
警告上下文中的
lint 和 d
oclint 是什么?
4.
警告上下文中的
Lint 和 D
oclint 是什么?
5.
自动生成运行时编译器测试时使用的目录是什么?
5.
自动生成运行时编译器测试时使用的目录是什么?
6.
在确定 CDS 类时,
`-Xshare`
命令行选项使用了什么标志?
6.
在确定 CDS 类时,
`-Xshare`
命令行选项使用了什么标志?
7.
场景生成器生成的文件扩展名是什么?
7.
场景生成器生成的文件扩展名是什么?
...
...
new/master-java11/12.md
浏览文件 @
4c8c6d85
...
@@ -56,13 +56,13 @@
...
@@ -56,13 +56,13 @@
软件开发的许多方面都有标准,而反应式编程也没有逃脱这一点。有一个
**反应流**
计划来标准化异步流处理。在 Java 上下文中,具体的焦点是 JVM 和 JavaScript。
软件开发的许多方面都有标准,而反应式编程也没有逃脱这一点。有一个
**反应流**
计划来标准化异步流处理。在 Java 上下文中,具体的焦点是 JVM 和 JavaScript。
reactivestreams
计划旨在解决控制线程之间如何交换数据流的问题。正如您在上一节中所记得的,处理器的概念是基于对发布者或接收器没有影响。本无影响授权书规定,不需要以下内容:
Reactive 流
计划旨在解决控制线程之间如何交换数据流的问题。正如您在上一节中所记得的,处理器的概念是基于对发布者或接收器没有影响。本无影响授权书规定,不需要以下内容:
*
数据缓冲
*
数据缓冲
*
数据翻译
*
数据翻译
*
转换
*
转换
该标准的基本语义定义了数据流元素传输的规则。这个标准是专门为 Java9 平台而建立的。Reactive
Streams
包含一个库,可以帮助开发人员在
`org.reactivestreams`
和
`java.util.concurrent.Flow`
名称空间之间进行转换。
该标准的基本语义定义了数据流元素传输的规则。这个标准是专门为 Java9 平台而建立的。Reactive
流
包含一个库,可以帮助开发人员在
`org.reactivestreams`
和
`java.util.concurrent.Flow`
名称空间之间进行转换。
成功使用反应式编程和反应式流标准化的关键是理解相关术语:
成功使用反应式编程和反应式流标准化的关键是理解相关术语:
...
@@ -85,7 +85,7 @@ reactivestreams 计划旨在解决控制线程之间如何交换数据流的问
...
@@ -85,7 +85,7 @@ reactivestreams 计划旨在解决控制线程之间如何交换数据流的问
|
|
在下一节中,我们将研究 Java 平台中的
`Flow`
api
,因为它们对应于反应流规范。
在下一节中,我们将研究 Java 平台中的
`Flow`
API
,因为它们对应于反应流规范。
# 流 API
# 流 API
...
@@ -95,7 +95,7 @@ reactivestreams 计划旨在解决控制线程之间如何交换数据流的问
...
@@ -95,7 +95,7 @@ reactivestreams 计划旨在解决控制线程之间如何交换数据流的问
让我们看看这四个接口。
让我们看看这四个接口。
#
这个 Flow.发布者
接口
#
`Flow.Publisher`
接口
`Flow.Publisher`
接口是一个函数式接口。
`Publisher`
是发送给用户的数据的生产者:
`Flow.Publisher`
接口是一个函数式接口。
`Publisher`
是发送给用户的数据的生产者:
...
@@ -104,7 +104,7 @@ reactivestreams 计划旨在解决控制线程之间如何交换数据流的问
...
@@ -104,7 +104,7 @@ reactivestreams 计划旨在解决控制线程之间如何交换数据流的问
public
static
interface
Flow
.
Publisher
<
T
>
public
static
interface
Flow
.
Publisher
<
T
>
```
```
此函数式接口可以用作 Lambda 表达式赋值目标。它只接受一个参数
subscribed item type
`<T>`
。它有一种方法,即
`void subscribe(Flow.Subscriber subscriber)`
。
此函数式接口可以用作 Lambda 表达式赋值目标。它只接受一个参数
,所订阅项目的类型
`<T>`
。它有一种方法,即
`void subscribe(Flow.Subscriber subscriber)`
。
# 这个流量订户接口
# 这个流量订户接口
...
@@ -114,7 +114,7 @@ public static interface Flow.Publisher<T>
...
@@ -114,7 +114,7 @@ public static interface Flow.Publisher<T>
public
static
interface
Flow
.
Subscriber
<
T
>
public
static
interface
Flow
.
Subscriber
<
T
>
```
```
此接口设置为接收消息。它只接受一个参数
subscribed item type
,
`<T>`
。它有以下方法:
此接口设置为接收消息。它只接受一个参数
,所订阅项目的类型
,
`<T>`
。它有以下方法:
*
`void onComplete()`
*
`void onComplete()`
*
`void onError(Throwable throwable)`
*
`void onError(Throwable throwable)`
...
@@ -227,7 +227,7 @@ Java 平台最近得到了增强,以改进并发性的使用。在本节中,
...
@@ -227,7 +227,7 @@ Java 平台最近得到了增强,以改进并发性的使用。在本节中,
# 并发性解释
# 并发性解释
并行处理从 20 世纪 60 年代就开始了,在那些形成的年代,我们已经有了允许多个进程共享一个处理器的系统。这些系统被更清楚地定义为伪并行系统,因为它看起来只是多个进程同时被执行。时至今日,我们的计算机仍以这种方式运行。20 世纪 60 年代和现在的区别在于,我们的计算机可以有多个
cpu,每个 cpu
都有多个内核,这更好地支持并发。
并行处理从 20 世纪 60 年代就开始了,在那些形成的年代,我们已经有了允许多个进程共享一个处理器的系统。这些系统被更清楚地定义为伪并行系统,因为它看起来只是多个进程同时被执行。时至今日,我们的计算机仍以这种方式运行。20 世纪 60 年代和现在的区别在于,我们的计算机可以有多个
CPU,每个 CPU
都有多个内核,这更好地支持并发。
并发性和并行性经常被用作可互换的术语。并发是指当多个进程重叠时,尽管开始和停止时间可能不同。并行性发生在任务同时启动、运行和停止时。
并发性和并行性经常被用作可互换的术语。并发是指当多个进程重叠时,尽管开始和停止时间可能不同。并行性发生在任务同时启动、运行和停止时。
...
@@ -398,9 +398,9 @@ varT.start();
...
@@ -398,9 +398,9 @@ varT.start();
# 可完成的未来 API 增强
# 可完成的未来 API 增强
`CompletableFuture<T>`
类是
`java.util.concurrent`
包的一部分。该类扩展了
`Object`
类,实现了
`Future<T>`
和
`CompletionStage<T>`
接口。此类用于注释可以完成的线程。我们可以使用
`CompletableFuture`
类来表示未来的结果。当使用
complete
方法时,可以完成将来的结果。
`CompletableFuture<T>`
类是
`java.util.concurrent`
包的一部分。该类扩展了
`Object`
类,实现了
`Future<T>`
和
`CompletionStage<T>`
接口。此类用于注释可以完成的线程。我们可以使用
`CompletableFuture`
类来表示未来的结果。当使用
`complete`
方法时,可以完成将来的结果。
重要的是要认识到,如果多个线程试图同时完成(
finish 或 cancel
),除一个线程外,其他所有线程都将失败。让我们看看这个类,然后看看增强功能。
重要的是要认识到,如果多个线程试图同时完成(
完成或取消
),除一个线程外,其他所有线程都将失败。让我们看看这个类,然后看看增强功能。
# 课程详情
# 课程详情
...
@@ -557,7 +557,7 @@ while ( notInReceiptOfEventNotification ); {
...
@@ -557,7 +557,7 @@ while ( notInReceiptOfEventNotification ); {
# 摘要
# 摘要
在本章中,我们讨论了 Java 平台的并发增强。我们将并发作为一个核心 Java 概念进行了深入的研究,并着眼于 Java 提供了什么。我们还研究了支持反应式编程的
`Flow`
类 API。此外,我们还探讨了并发增强和新的
spin wait
提示。
在本章中,我们讨论了 Java 平台的并发增强。我们将并发作为一个核心 Java 概念进行了深入的研究,并着眼于 Java 提供了什么。我们还研究了支持反应式编程的
`Flow`
类 API。此外,我们还探讨了并发增强和新的
旋转等待
提示。
在下一章中,我们将重点介绍 Java 平台的安全增强功能,以及实际示例。
在下一章中,我们将重点介绍 Java 平台的安全增强功能,以及实际示例。
...
@@ -567,7 +567,7 @@ while ( notInReceiptOfEventNotification ); {
...
@@ -567,7 +567,7 @@ while ( notInReceiptOfEventNotification ); {
2.
什么是数据流?
2.
什么是数据流?
3.
使用反应式编程的主要好处是什么?
3.
使用反应式编程的主要好处是什么?
4.
反应式编程的无影响授权有哪些规定?
4.
反应式编程的无影响授权有哪些规定?
5.
`Flow`
a
类是什么包装?
5.
`Flow`
类是什么包装?
6.
列出
`Flow`
类的四个接口。
6.
列出
`Flow`
类的四个接口。
7.
什么是并发性?
7.
什么是并发性?
8.
并发和并行的区别是什么?
8.
并发和并行的区别是什么?
...
...
new/master-java11/13.md
浏览文件 @
4c8c6d85
# 安全增强功能
# 安全增强功能
在最后一章中,我们讨论了现代 Java 平台的并发增强。我们深入研究了并发性,它既是一个核心概念,也是 Java 的一系列增强。我们还研究了支持反应式编程的
`Flow`
类 API。此外,我们还探讨了 Java 的并发增强和
spin wait
提示。
在最后一章中,我们讨论了现代 Java 平台的并发增强。我们深入研究了并发性,它既是一个核心概念,也是 Java 的一系列增强。我们还研究了支持反应式编程的
`Flow`
类 API。此外,我们还探讨了 Java 的并发增强和
旋转等待
提示。
在本章中,我们将介绍最近对 JDK 所做的几个涉及安全性的更改。这些变化的大小并不反映其重要性。现代 Java 平台的安全增强为开发人员提供了编写和维护比以前更安全的应用程序的能力。
在本章中,我们将介绍最近对 JDK 所做的几个涉及安全性的更改。这些变化的大小并不反映其重要性。现代 Java 平台的安全增强为开发人员提供了编写和维护比以前更安全的应用程序的能力。
...
@@ -215,7 +215,7 @@ enum {
...
@@ -215,7 +215,7 @@ enum {
# Java 中的 DTLS 支持
# Java 中的 DTLS 支持
dtls
API 的 Java 实现是独立于传输的,而且是轻量级的。API 的设计考虑如下:
DTLS
API 的 Java 实现是独立于传输的,而且是轻量级的。API 的设计考虑如下:
*
将不管理读取超时
*
将不管理读取超时
*
实现将为每个包装/展开操作使用一个 TLS 记录
*
实现将为每个包装/展开操作使用一个 TLS 记录
...
@@ -225,7 +225,7 @@ dtlsAPI 的 Java 实现是独立于传输的,而且是轻量级的。API 的
...
@@ -225,7 +225,7 @@ dtlsAPI 的 Java 实现是独立于传输的,而且是轻量级的。API 的
DTLS 是一种协议,用于在将数据传递到传输层协议之前保护来自应用层的数据。DTLS 是加密和传输实时数据的一个很好的解决方案。应谨慎行事,以免在应用程序实现中引入漏洞。以下是在 Java 应用程序中实现 DTL 的一些安全注意事项:
DTLS 是一种协议,用于在将数据传递到传输层协议之前保护来自应用层的数据。DTLS 是加密和传输实时数据的一个很好的解决方案。应谨慎行事,以免在应用程序实现中引入漏洞。以下是在 Java 应用程序中实现 DTL 的一些安全注意事项:
*
实现
dtlsv
1.2,因为它是 Java 支持的最新版本。
*
实现
DTLS
1.2,因为它是 Java 支持的最新版本。
*
避免
**Rivest Shamir Adleman**
(
**RSA**
)加密。如果必须使用 RSA,请为私钥添加额外的安全性,因为这是 RSA 的一个弱点。
*
避免
**Rivest Shamir Adleman**
(
**RSA**
)加密。如果必须使用 RSA,请为私钥添加额外的安全性,因为这是 RSA 的一个弱点。
*
当使用
**椭圆曲线 Diffie-Hellman**
(
**ECDH**
)匿名密钥协商协议时,使用 192 位或更多。192 位的值基于
**美国国家标准与技术研究所**
(
**NIST**
)的建议。
*
当使用
**椭圆曲线 Diffie-Hellman**
(
**ECDH**
)匿名密钥协商协议时,使用 192 位或更多。192 位的值基于
**美国国家标准与技术研究所**
(
**NIST**
)的建议。
*
强烈建议使用
**带有相关数据的认证加密**
(
**AEAD**
),这是一种加密形式。AEAD 为加密和解密的数据提供真实性、机密性和完整性保证。
*
强烈建议使用
**带有相关数据的认证加密**
(
**AEAD**
),这是一种加密形式。AEAD 为加密和解密的数据提供真实性、机密性和完整性保证。
...
@@ -273,7 +273,7 @@ protected KeyStore(KeyStoreSpi keyStoresSpi, Provider provider, String type)
...
@@ -273,7 +273,7 @@ protected KeyStore(KeyStoreSpi keyStoresSpi, Provider provider, String type)
`KeyStore`
类包含以下接口:
`KeyStore`
类包含以下接口:
*
`public static interface KeyStore.Entry`
:此接口作为
`KeyStore`
条目类型的标记,不包含方法。
*
`public static interface KeyStore.Entry`
:此接口作为
`KeyStore`
条目类型的标记,不包含方法。
*
`public static interface KeyStore.LoadStoreParameter`
:此接口作为加载和存储参数的标记,有如下返回
null
的方法,或用于保护
`KeyStore`
数据的参数:
*
`public static interface KeyStore.LoadStoreParameter`
:此接口作为加载和存储参数的标记,有如下返回
`null`
的方法,或用于保护
`KeyStore`
数据的参数:
*
`getProtectionParameter()`
*
`getProtectionParameter()`
*
`public static interface KeyStore.ProtectionParameter`
:此接口作为
`KeyStore`
保护参数的标记,不含方法。
*
`public static interface KeyStore.ProtectionParameter`
:此接口作为
`KeyStore`
保护参数的标记,不含方法。
...
@@ -298,7 +298,7 @@ public abstract static class KeyStore.Builder extends Object
...
@@ -298,7 +298,7 @@ public abstract static class KeyStore.Builder extends Object
*
`public static KeyStore.Builder newInstance(String type, Provider provider, File file, KeyStore.ProtectionParameter protection)`
*
`public static KeyStore.Builder newInstance(String type, Provider provider, File file, KeyStore.ProtectionParameter protection)`
*
`public static KeyStore.Builder newInstance(String type, Provider provider, KeyStore.ProtectionParameter protection)`
*
`public static KeyStore.Builder newInstance(String type, Provider provider, KeyStore.ProtectionParameter protection)`
#
CallbackHandlerProtection
类
#
`CallbackHandlerProtection`
类
`KeyStore.CallbackHandlerProtection`
类定义如下:
`KeyStore.CallbackHandlerProtection`
类定义如下:
...
@@ -324,9 +324,9 @@ public static class KeyStore.PasswordProtection extends Object implements KeySto
...
@@ -324,9 +324,9 @@ public static class KeyStore.PasswordProtection extends Object implements KeySto
*
`public void destroy() throws DestroyFailedException`
:此方法清除密码
*
`public void destroy() throws DestroyFailedException`
:此方法清除密码
*
`public char[] getPassword()`
:返回对密码的引用
*
`public char[] getPassword()`
:返回对密码的引用
*
`public boolean isDestroyed()`
:清除密码返回
true
*
`public boolean isDestroyed()`
:清除密码返回
`true`
#
PrivateKeyEntry
类
#
`PrivateKeyEntry`
类
`KeyStore.PrivateKeyEntry`
类定义如下:
`KeyStore.PrivateKeyEntry`
类定义如下:
...
@@ -341,7 +341,7 @@ public static final class KeyStore.PrivateKeyEntry extends Object implements Key
...
@@ -341,7 +341,7 @@ public static final class KeyStore.PrivateKeyEntry extends Object implements Key
*
`public PrivateKey getPrivateKey()`
:返回当前分录的
`PrivateKey`
*
`public PrivateKey getPrivateKey()`
:返回当前分录的
`PrivateKey`
*
`public String toString()`
:返回
`PrivateKeyEntry`
为
`String`
*
`public String toString()`
:返回
`PrivateKeyEntry`
为
`String`
#
SecretKeyEntry
类
#
`SecretKeyEntry`
类
`KeyStore.SecretKeyEntry`
类定义如下:
`KeyStore.SecretKeyEntry`
类定义如下:
...
@@ -354,7 +354,7 @@ public static final class KeyStore.SecretKeyEntry extends Object implements KeyS
...
@@ -354,7 +354,7 @@ public static final class KeyStore.SecretKeyEntry extends Object implements KeyS
*
`public SecretKey getSecretKey()`
:返回分录的
`SecretKey`
*
`public SecretKey getSecretKey()`
:返回分录的
`SecretKey`
*
`public String toString()`
:返回
`SecretKeyEntry`
为
`String`
*
`public String toString()`
:返回
`SecretKeyEntry`
为
`String`
#
TrustedCertificateEntry
类
#
`TrustedCertificateEntry`
类
`KeyStore.TrustedCertificateEntry`
类定义如下:
`KeyStore.TrustedCertificateEntry`
类定义如下:
...
@@ -413,7 +413,7 @@ try {
...
@@ -413,7 +413,7 @@ try {
当运行安装了安全管理器的应用程序时,现代 Java 平台包括性能改进。安全管理器可能导致处理开销和不理想的应用程序性能。
当运行安装了安全管理器的应用程序时,现代 Java 平台包括性能改进。安全管理器可能导致处理开销和不理想的应用程序性能。
这是一项令人印象深刻的任务,因为当前运行安全管理器时的 CPU 开销估计会导致 10-15% 的性能下降。完全消除 CPU 开销是不可行的,因为运行
security manager
需要一些 CPU 处理。也就是说,目标是尽可能降低间接费用的百分比。
这是一项令人印象深刻的任务,因为当前运行安全管理器时的 CPU 开销估计会导致 10-15% 的性能下降。完全消除 CPU 开销是不可行的,因为运行
安全管理器
需要一些 CPU 处理。也就是说,目标是尽可能降低间接费用的百分比。
这项工作导致了以下优化,每个优化将在后面的部分中详细介绍:
这项工作导致了以下优化,每个优化将在后面的部分中详细介绍:
...
@@ -427,7 +427,7 @@ try {
...
@@ -427,7 +427,7 @@ try {
JDK 使用
`ConcurrentHashMap`
将
`ProtectionDomain`
映射到
`PermissionCollection`
。
`ConcurrentHashMap`
通常用于应用程序中的高并发性。它具有以下特点:
JDK 使用
`ConcurrentHashMap`
将
`ProtectionDomain`
映射到
`PermissionCollection`
。
`ConcurrentHashMap`
通常用于应用程序中的高并发性。它具有以下特点:
*
线程安全的
*
线程安全的
*
enter
映射不需要同步
*
进入
映射不需要同步
*
快速阅读
*
快速阅读
*
写入使用锁
*
写入使用锁
*
无对象级锁定
*
无对象级锁定
...
@@ -455,7 +455,7 @@ public class ConcurrentHashMap<K, V> extends AbstractMap<K, V> implements Concur
...
@@ -455,7 +455,7 @@ public class ConcurrentHashMap<K, V> extends AbstractMap<K, V> implements Concur
*
`PermissionCollection`
条目现在存储在
`ConcurrentHashMap`
中。它们以前被存储为
`Permission`
类中的
`HashMap`
。
*
`PermissionCollection`
条目现在存储在
`ConcurrentHashMap`
中。它们以前被存储为
`Permission`
类中的
`HashMap`
。
*
权限现在存储在
`PermissionCollection`
的子类中的并发集合中。
*
权限现在存储在
`PermissionCollection`
的子类中的并发集合中。
#
这个 Java.Security.code 源包裹
#
`java.security.CodeSource`包
哈希码是一个对象生成的数字,存储在哈希表中,用于快速存储和检索。Java 中的每个对象都有一个哈希代码。以下是哈希代码的一些特征和规则:
哈希码是一个对象生成的数字,存储在哈希表中,用于快速存储和检索。Java 中的每个对象都有一个哈希代码。以下是哈希代码的一些特征和规则:
...
@@ -473,12 +473,12 @@ public class CodeSource extends Object implements Serializable
...
@@ -473,12 +473,12 @@ public class CodeSource extends Object implements Serializable
此类具有以下方法:
此类具有以下方法:
*
`public boolean equals(Object obj)`
:如果对象相等,则返回
true。这将重写
`Object`
类中的 equals
方法。
*
`public boolean equals(Object obj)`
:如果对象相等,则返回
`true`
。这将重写
`Object`
类中的
`equals`
方法。
*
`public final Certificate[] getCertificates()`
:返回证书数组。
*
`public final Certificate[] getCertificates()`
:返回证书数组。
*
`public final CodeSigner[] getCodeSigners()`
:返回与
`CodeSource`
关联的代码签名者数组。
*
`public final CodeSigner[] getCodeSigners()`
:返回与
`CodeSource`
关联的代码签名者数组。
*
`public final URL getLocation()`
:返回 URL。
*
`public final URL getLocation()`
:返回 URL。
*
`public int hashCode()`
:返回当前对象的哈希码值。
*
`public int hashCode()`
:返回当前对象的哈希码值。
*
`public boolean implies(CodeSource codesource)`
:如果给定的代码源满足以下条件,则返回
true
:
*
`public boolean implies(CodeSource codesource)`
:如果给定的代码源满足以下条件,则返回
`true`
:
*
不为空
*
不为空
*
对象的证书不为空
*
对象的证书不为空
*
对象的位置不为空
*
对象的位置不为空
...
@@ -492,7 +492,7 @@ public class CodeSource extends Object implements Serializable
...
@@ -492,7 +492,7 @@ public class CodeSource extends Object implements Serializable
![](
img/64debc0e-e1c0-4ce6-bf99-a8960cfad77a.png
)
![](
img/64debc0e-e1c0-4ce6-bf99-a8960cfad77a.png
)
checkPackageAccess
方法的异常
`checkPackageAccess`
方法的异常
# TLS 应用层协议协商扩展
# TLS 应用层协议协商扩展
...
@@ -506,7 +506,7 @@ ALPN 是 TLS 扩展,可用于协商在使用安全连接时要实现的协议
...
@@ -506,7 +506,7 @@ ALPN 是 TLS 扩展,可用于协商在使用安全连接时要实现的协议
TLS 握手的五个步骤
TLS 握手的五个步骤
#
这个 Javax.net.ssl 文件包裹
#
`java.net.ssl`包
`java.net.ssl`
包包含与安全套接字包相关的类。这允许我们以 SSL 为例,可靠地检测引入网络字节流的错误。它还提供了加密数据以及提供客户端和服务器认证的能力。
`java.net.ssl`
包包含与安全套接字包相关的类。这允许我们以 SSL 为例,可靠地检测引入网络字节流的错误。它还提供了加密数据以及提供客户端和服务器认证的能力。
...
@@ -548,7 +548,7 @@ TLS 握手的五个步骤
...
@@ -548,7 +548,7 @@ TLS 握手的五个步骤
*
`public abstract class X509ExtendedKeyManager extends Object implements X509KeyManager`
*
`public abstract class X509ExtendedKeyManager extends Object implements X509KeyManager`
*
`public abstract class X509ExtendedTrustManager extends Object implements x509TrustManager`
*
`public abstract class X509ExtendedTrustManager extends Object implements x509TrustManager`
#
这个 Java.net.ssl 文件
包扩展
#
`java.net.ssl`
包扩展
Java 平台中对
`java.net.ssl`
包的这个更改使得它现在支持 TLS-ALPN 扩展。这一变化的主要好处如下:
Java 平台中对
`java.net.ssl`
包的这个更改使得它现在支持 TLS-ALPN 扩展。这一变化的主要好处如下:
...
@@ -590,15 +590,15 @@ struct {
...
@@ -590,15 +590,15 @@ struct {
# 利用 GHASH 和 RSA 的 CPU 指令
# 利用 GHASH 和 RSA 的 CPU 指令
现代 Java 平台包括一个改进的加密操作性能,特别是 GHASH 和 RSA。通过利用最新的 SPARC 和
intelx64cpu
指令,Java 实现了这种性能改进。
现代 Java 平台包括一个改进的加密操作性能,特别是 GHASH 和 RSA。通过利用最新的 SPARC 和
IntelX64CPU
指令,Java 实现了这种性能改进。
此增强不需要新的或修改的 API 作为 Java 平台的一部分。
此增强不需要新的或修改的 API 作为 Java 平台的一部分。
# 散列
# 散列
**Galois HASH**
(
**GHASH**
)和
**RSA**
是密码系统哈希算法。哈希是由文本字符串生成的固定长度的字符串或数字。算法,更具体地说是散列算法,被设计成这样的结果散列不能被反向工程。我们使用散列存储用
salt
生成的密码。
**Galois HASH**
(
**GHASH**
)和
**RSA**
是密码系统哈希算法。哈希是由文本字符串生成的固定长度的字符串或数字。算法,更具体地说是散列算法,被设计成这样的结果散列不能被反向工程。我们使用散列存储用
盐
生成的密码。
在密码学中,
salt
是一种随机数据,用作哈希函数生成密码的输入。盐有助于防止彩虹表攻击和字典攻击。
在密码学中,
盐
是一种随机数据,用作哈希函数生成密码的输入。盐有助于防止彩虹表攻击和字典攻击。
下图说明了哈希的基本工作原理:
下图说明了哈希的基本工作原理:
...
@@ -610,9 +610,9 @@ struct {
...
@@ -610,9 +610,9 @@ struct {
![](
img/ce245ee5-0a14-442b-9903-34da1912a923.png
)
![](
img/ce245ee5-0a14-442b-9903-34da1912a923.png
)
哈希和
salt
功能
哈希和
盐
功能
如下图所示,验证过程从用户输入纯文本密码开始。散列算法接受纯文本并用存储的
salt
重新散列它。然后,将得到的哈希密码与存储的密码进行比较:
如下图所示,验证过程从用户输入纯文本密码开始。散列算法接受纯文本并用存储的
盐
重新散列它。然后,将得到的哈希密码与存储的密码进行比较:
![](
img/7a039fd2-0c1b-40d6-9b16-bf68c1aa3dbf.png
)
![](
img/7a039fd2-0c1b-40d6-9b16-bf68c1aa3dbf.png
)
...
@@ -651,12 +651,12 @@ X.509 证书是使用 X509 **公钥基础设施**(**PKI**)的数字证书。
...
@@ -651,12 +651,12 @@ X.509 证书是使用 X509 **公钥基础设施**(**PKI**)的数字证书。
用于 TLS 的新 OCSP 装订包括 Java9、10 和 11 的以下系统属性更改:
用于 TLS 的新 OCSP 装订包括 Java9、10 和 11 的以下系统属性更改:
*
`jdk.tls.client.enableStatusRequestExtension`
:
*
`jdk.tls.client.enableStatusRequestExtension`
:
*
默认设置:
true
*
默认设置:
`true`
*
启用
`status_request`
扩展
*
启用
`status_request`
扩展
*
启用
`status_request_v2`
扩展
*
启用
`status_request_v2`
扩展
*
允许处理来自服务器的
`CertificateStatus`
消息
*
允许处理来自服务器的
`CertificateStatus`
消息
*
`jdk.tls.server.enableStatusRequestExtension`
:
*
`jdk.tls.server.enableStatusRequestExtension`
:
*
默认设置:
false
*
默认设置:
`false`
*
启用 OCSP 装订支持服务器端
*
启用 OCSP 装订支持服务器端
*
`jdk.tls.stapling.responseTimeout`
:
*
`jdk.tls.stapling.responseTimeout`
:
*
默认设置:5000 毫秒
*
默认设置:5000 毫秒
...
@@ -674,15 +674,15 @@ X.509 证书是使用 X509 **公钥基础设施**(**PKI**)的数字证书。
...
@@ -674,15 +674,15 @@ X.509 证书是使用 X509 **公钥基础设施**(**PKI**)的数字证书。
*
可以为没有
**权限信息访问**
(
**AIA**
)扩展的证书设置默认 URI
*
可以为没有
**权限信息访问**
(
**AIA**
)扩展的证书设置默认 URI
*
除非设置了
`jdk.tls.stapling.Override`
属性,否则不重写 AIA 扩展
*
除非设置了
`jdk.tls.stapling.Override`
属性,否则不重写 AIA 扩展
*
`jdk.tls.stapling.respoderOverride`
:
*
`jdk.tls.stapling.respoderOverride`
:
*
默认设置:
false
*
默认设置:
`false`
*
允许
`jdk.tls.stapling.responderURI`
提供的属性重写 AIA 扩展值
*
允许
`jdk.tls.stapling.responderURI`
提供的属性重写 AIA 扩展值
*
`jdk.tls.stapling.ignoreExtensions`
:
*
`jdk.tls.stapling.ignoreExtensions`
:
*
默认设置:
false
*
默认设置:
`false`
*
禁用 OCSP 扩展转发,如
`status_request`
或
`status_request_v2`
TLS 扩展中所述
*
禁用 OCSP 扩展转发,如
`status_request`
或
`status_request_v2`
TLS 扩展中所述
`status_request`
和
`status_request_v2`
TLS
h
ello 扩展现在都受客户端和服务器端 Java 实现的支持。
`status_request`
和
`status_request_v2`
TLS
H
ello 扩展现在都受客户端和服务器端 Java 实现的支持。
# 基于 DRBG 的
SecureRandom
实现
# 基于 DRBG 的
`SecureRandom`
实现
在 Java 的早期版本中,即版本 8 和更早版本中,JDK 有两种生成安全随机数的方法。有一种方法是用 Java 编写的,使用基于 SHA1 的随机数生成,而且不是很强。另一种方法依赖于平台,使用预配置的库。
在 Java 的早期版本中,即版本 8 和更早版本中,JDK 有两种生成安全随机数的方法。有一种方法是用 Java 编写的,使用基于 SHA1 的随机数生成,而且不是很强。另一种方法依赖于平台,使用预配置的库。
...
...
new/master-java11/14.md
浏览文件 @
4c8c6d85
...
@@ -41,7 +41,7 @@ Java9 中引入了为 JVM 创建统一的日志模式。以下是这项工作的
...
@@ -41,7 +41,7 @@ Java9 中引入了为 JVM 创建统一的日志模式。以下是这项工作的
*
设置所有日志消息的格式,使其易于人阅读
*
设置所有日志消息的格式,使其易于人阅读
*
添加装饰,如正常运行时间、级别和标记
*
添加装饰,如正常运行时间、级别和标记
*
与级别类似,用于选择基于装饰记录哪些消息
*
与级别类似,用于选择基于装饰记录哪些消息
*
将
pre-java9
`tty>print`
日志转换为使用统一日志作为输出
*
将
Java9 之前的
`tty>print`
日志转换为使用统一日志作为输出
*
允许使用
`jcmd`
和
`MBeans`
进行动态消息配置
*
允许使用
`jcmd`
和
`MBeans`
进行动态消息配置
*
允许启用和禁用单个日志消息
*
允许启用和禁用单个日志消息
*
添加确定装饰打印顺序的功能
*
添加确定装饰打印顺序的功能
...
@@ -153,9 +153,9 @@ parameter=value
...
@@ -153,9 +153,9 @@ parameter=value
在 Java 日志框架的上下文中,装饰是关于日志消息的元数据。以下是按字母顺序排列的可用装饰品列表:
在 Java 日志框架的上下文中,装饰是关于日志消息的元数据。以下是按字母顺序排列的可用装饰品列表:
*
`level`
:与记录的消息相关联的级别
*
`level`
:与记录的消息相关联的级别
*
`pid`
:
PID=处理器
标识符
*
`pid`
:
进程
标识符
*
`tags`
:与记录的消息相关联的标签集
*
`tags`
:与记录的消息相关联的标签集
*
`tid`
:
TID=
线程标识符
*
`tid`
:线程标识符
*
`time`
:指当前日期和时间,采用 ISO-8601 格式
*
`time`
:指当前日期和时间,采用 ISO-8601 格式
*
`timemillis`
:当前时间(毫秒)
*
`timemillis`
:当前时间(毫秒)
*
`timenanos`
:当前时间(纳秒)
*
`timenanos`
:当前时间(纳秒)
...
@@ -344,9 +344,9 @@ Java 承诺能够有限地控制 JVM 编译器并在运行时进行更改。这
...
@@ -344,9 +344,9 @@ Java 承诺能够有限地控制 JVM 编译器并在运行时进行更改。这
# 堆分析代理
# 堆分析代理
jvmti
`hprof`
代理最近从 Java 平台上删除了。以下是与此更改相关的关键术语:
JVMTI
`hprof`
代理最近从 Java 平台上删除了。以下是与此更改相关的关键术语:
*
**工具接口**
(
**TI**
):这是一个本机编程接口,允许工具控制正在 Java 虚拟机内运行的应用程序的执行。该接口还允许状态查询。这个工具的完整术语是 Java 虚拟机工具接口,或
jvmti
。
*
**工具接口**
(
**TI**
):这是一个本机编程接口,允许工具控制正在 Java 虚拟机内运行的应用程序的执行。该接口还允许状态查询。这个工具的完整术语是 Java 虚拟机工具接口,或
JVMTI
。
*
**堆性能测试**
(
**HPROF**
):这是一个内部 JDK 工具,用于分析 JVM 对 cpu 和堆的使用。开发人员最常见的暴露是崩溃后生成的文件。生成的文件包含堆转储。
*
**堆性能测试**
(
**HPROF**
):这是一个内部 JDK 工具,用于分析 JVM 对 cpu 和堆的使用。开发人员最常见的暴露是崩溃后生成的文件。生成的文件包含堆转储。
Java11JDK 不包含
`hprof`
代理。它被删除主要是因为有更好的替代品可用。以下是它们的相关功能表:
Java11JDK 不包含
`hprof`
代理。它被删除主要是因为有更好的替代品可用。以下是它们的相关功能表:
...
@@ -456,7 +456,7 @@ javac --release <release> <source files>
...
@@ -456,7 +456,7 @@ javac --release <release> <source files>
# 基于 Java 的 JIT 编译器实验
# 基于 Java 的 JIT 编译器实验
在 Java10 中启用了基于 Java 的即时(
Just-in-Time)编译器(
**JIT**
)
,可以作为 Linux/x64 平台的实验性 JIT 编译器。基于 Java 的 JIT 编译器被称为 Graal
在 Java10 中启用了基于 Java 的即时(
**JIT**
)编译器
,可以作为 Linux/x64 平台的实验性 JIT 编译器。基于 Java 的 JIT 编译器被称为 Graal
做出这一更改的目的是希望通过实验可以证明将 JIT 编译器添加到 JDK 中的概念
做出这一更改的目的是希望通过实验可以证明将 JIT 编译器添加到 JDK 中的概念
...
...
new/master-java11/15.md
浏览文件 @
4c8c6d85
...
@@ -18,7 +18,7 @@ IDE 软件包就足够了。来自 JetBrains 的 IntelliJ IDEA 用于与本章
...
@@ -18,7 +18,7 @@ IDE 软件包就足够了。来自 JetBrains 的 IntelliJ IDEA 用于与本章
# 支持 UTF-8
# 支持 UTF-8
**Unicode 转换格式
-
8**
(
**UTF-8**
)是一个字符集,它封装了所有 Unicode 字符,使用一到四个 8 位字节。UTF-8 是面向字节的 Unicode 编码格式,自 2009 年以来一直是网页编码的主要字符集。
**Unicode 转换格式 8**
(
**UTF-8**
)是一个字符集,它封装了所有 Unicode 字符,使用一到四个 8 位字节。UTF-8 是面向字节的 Unicode 编码格式,自 2009 年以来一直是网页编码的主要字符集。
以下是 UTF-8 的一些特点:
以下是 UTF-8 的一些特点:
...
@@ -32,7 +32,7 @@ UTF-8 的广泛使用强调了确保 Java 平台完全支持 UTF-8 的重要性
...
@@ -32,7 +32,7 @@ UTF-8 的广泛使用强调了确保 Java 平台完全支持 UTF-8 的重要性
让我们看一看前现代 Java(Java8 和更早版本)
`ResourceBundle`
类,然后看看在现代 Java 平台上对这个类做了哪些更改。
让我们看一看前现代 Java(Java8 和更早版本)
`ResourceBundle`
类,然后看看在现代 Java 平台上对这个类做了哪些更改。
#
ResourceBundle
类
#
`ResourceBundle`
类
下面的类为开发人员提供了从资源包中隔离特定于语言环境的资源的能力。这个类大大简化了本地化和翻译:
下面的类为开发人员提供了从资源包中隔离特定于语言环境的资源的能力。这个类大大简化了本地化和翻译:
...
@@ -609,7 +609,7 @@ protected void setParent(ResourceBundle parent)
...
@@ -609,7 +609,7 @@ protected void setParent(ResourceBundle parent)
|
**组件**
|
**明细**
|
|
**组件**
|
**明细**
|
|
**抛出**
| 没有 |
|
**抛出**
| 没有 |
|
**参数**
|
`parent`
:当前
bundle 的
`parent`
bundle
|
|
**参数**
|
`parent`
:当前
捆绑的
`parent`
捆绑
|
|
**返回**
| 没有 |
|
**返回**
| 没有 |
# 现代 Java 平台的变化
# 现代 Java 平台的变化
...
@@ -644,7 +644,7 @@ Java 平台尚未实现以下 Unicode 标准:
...
@@ -644,7 +644,7 @@ Java 平台尚未实现以下 Unicode 标准:
让我们快速看一下这些类中的每一个,以帮助巩固我们对 Unicode 10.0.0 在 Java 平台上的广泛影响的理解。
让我们快速看一下这些类中的每一个,以帮助巩固我们对 Unicode 10.0.0 在 Java 平台上的广泛影响的理解。
#
这个 Java.lang 语言包裹
#
`java.lang.package`
`java.lang.package`
提供了几乎所有 Java 应用程序中使用的基本类。在本节中,我们将介绍
`Character`
和
`String`
类。
`java.lang.package`
提供了几乎所有 Java 应用程序中使用的基本类。在本节中,我们将介绍
`Character`
和
`String`
类。
...
@@ -668,7 +668,7 @@ public final class String extends Object implements
...
@@ -668,7 +668,7 @@ public final class String extends Object implements
修改
`Character`
和
`String`
类以支持更新的 Unicode 版本,即用于 Java9 和更高版本的版本 7.0,这是帮助保持 Java 作为首要编程语言的相关性的一个重要步骤。
修改
`Character`
和
`String`
类以支持更新的 Unicode 版本,即用于 Java9 和更高版本的版本 7.0,这是帮助保持 Java 作为首要编程语言的相关性的一个重要步骤。
#
这个 Java.text 文件包裹
#
`java.text`包
`Bidi`
、
`BreakIterator`
和
`Normalizer`
类的应用不如
`Character`
和
`String`
类广泛。以下是这些课程的简要概述:
`Bidi`
、
`BreakIterator`
和
`Normalizer`
类的应用不如
`Character`
和
`String`
类广泛。以下是这些课程的简要概述:
...
@@ -680,7 +680,7 @@ public final class Bidi extends Object
...
@@ -680,7 +680,7 @@ public final class Bidi extends Object
此类用于实现 Unicode 的双向算法。用于支持阿拉伯语或希伯来语。
此类用于实现 Unicode 的双向算法。用于支持阿拉伯语或希伯来语。
有关
*UNICODE 双向算法*
的具体信息,请访问
[
这个页面
](
http://unicode.org/reports/tr9/
)
。
有关
*UNICODE 双向算法*
的具体信息,请访问
[
这个页面
](
http://unicode.org/reports/tr9/
)
。
`BreakIterator`
类用于查找文本边界:
`BreakIterator`
类用于查找文本边界:
...
@@ -813,4 +813,4 @@ java.locale.providers=SPI,COMPAT,CLDR
...
@@ -813,4 +813,4 @@ java.locale.providers=SPI,COMPAT,CLDR
7.
JDK9、10 和 11 已经成功移植到 Linux/AArch64。列出三种实现。
7.
JDK9、10 和 11 已经成功移植到 Linux/AArch64。列出三种实现。
8.
什么是多分辨率图像?
8.
什么是多分辨率图像?
9.
哪个类用于从多分辨率图像中检索所需的变体?
9.
哪个类用于从多分辨率图像中检索所需的变体?
10.
什么是 CLDR?
**
10.
什么是 CLDR?
\ No newline at end of file
\ No newline at end of file
new/master-java11/16.md
浏览文件 @
4c8c6d85
...
@@ -75,7 +75,7 @@ JVM 依赖于一个常量池来确定类布局、实例、接口和数组。每
...
@@ -75,7 +75,7 @@ JVM 依赖于一个常量池来确定类布局、实例、接口和数组。每
# JEP338:向量 API
# JEP338:向量 API
将创建一个新的矢量 API,以便矢量计算可以可靠地编译成针对特定
cpu
优化的矢量硬件指令。这将使开发人员能够提供高效的标量计算。
将创建一个新的矢量 API,以便矢量计算可以可靠地编译成针对特定
CPU
优化的矢量硬件指令。这将使开发人员能够提供高效的标量计算。
# JEP339:Edwards 曲线数字签名算法
# JEP339:Edwards 曲线数字签名算法
...
@@ -90,7 +90,7 @@ JVM 依赖于一个常量池来确定类布局、实例、接口和数组。每
...
@@ -90,7 +90,7 @@ JVM 依赖于一个常量池来确定类布局、实例、接口和数组。每
*
Javadoc 标签的创建是为了区分 API、实现、注释和规范之间的差异
*
Javadoc 标签的创建是为了区分 API、实现、注释和规范之间的差异
*
新的 JMX 注释将用于注册托管资源
*
新的 JMX 注释将用于注册托管资源
*
GTK3 将在布局方面进行现代化改造
*
GTK3 将在布局方面进行现代化改造
*
将为 JMX 创建新的
restapi
*
将为 JMX 创建新的
REST API
每项建议的详细信息可从
[
这个页面
](
http://openjdk.java.net/jeps/0
)
获得。
每项建议的详细信息可从
[
这个页面
](
http://openjdk.java.net/jeps/0
)
获得。
...
@@ -179,7 +179,7 @@ Java 增强建议展示了 Java 平台的设计和实现变化。如前所述,
...
@@ -179,7 +179,7 @@ Java 增强建议展示了 Java 平台的设计和实现变化。如前所述,
# 音频合成引擎
# 音频合成引擎
这个项目正在考虑为 JDK 创建一个新的
midi 合成器。当前的 midi 合成器属于授权库。工作组希望看到新的 midi
合成器作为一个开源 JDK 资产。
这个项目正在考虑为 JDK 创建一个新的
MIDI 合成器。当前的 MIDI 合成器属于授权库。工作组希望看到新的 MIDI
合成器作为一个开源 JDK 资产。
# 仙人掌
# 仙人掌
...
@@ -187,7 +187,7 @@ Caciocavallo 项目旨在改进 OpenJDK AWT 内部接口。这扩展到二维子
...
@@ -187,7 +187,7 @@ Caciocavallo 项目旨在改进 OpenJDK AWT 内部接口。这扩展到二维子
# 通用虚拟机接口
# 通用虚拟机接口
公共 VM 接口项目的目标是为 OpenJDK 记录 VM 接口。这将使
classpath vm 和其他 vm
更容易使用 OpenJDK。
公共 VM 接口项目的目标是为 OpenJDK 记录 VM 接口。这将使
Classpath VM 和其他 VM
更容易使用 OpenJDK。
# 编译器语法
# 编译器语法
...
...
new/master-java11/17.md
浏览文件 @
4c8c6d85
...
@@ -24,7 +24,7 @@ Java 社区由数以百万计的开发人员组成,他们以一种或多种方
...
@@ -24,7 +24,7 @@ Java 社区由数以百万计的开发人员组成,他们以一种或多种方
您可以在
[
这个页面
](
http://blogs.oracle.com
)
浏览 Oracle 的博客目录。
您可以在
[
这个页面
](
http://blogs.oracle.com
)
浏览 Oracle 的博客目录。
internet
上有几个 Java 论坛。甲骨文在
[
这个页面
](
http://community.oracle.com
)
开设了一个官方的 Java 社区空间。Java 社区空间组织为以下空间:
互联网
上有几个 Java 论坛。甲骨文在
[
这个页面
](
http://community.oracle.com
)
开设了一个官方的 Java 社区空间。Java 社区空间组织为以下空间:
| Java | Java 冠军 |
| Java | Java 冠军 |
| #Java20 | Java 社区流程 |
| #Java20 | Java 社区流程 |
...
@@ -37,7 +37,7 @@ internet 上有几个 Java 论坛。甲骨文在[这个页面](http://community.
...
@@ -37,7 +37,7 @@ internet 上有几个 Java 论坛。甲骨文在[这个页面](http://community.
| 新 Java 空间的构想 | Java 用户组 |
| 新 Java 空间的构想 | Java 用户组 |
| 夜袭 | |
| 夜袭 | |
一些 Java 开发人员在 YouTube 上创建了
how-to
视频播放列表,其中许多被学术机构使用。这些可以是有趣的创造,是一个很好的方式回馈社会。
一些 Java 开发人员在 YouTube 上创建了
HOWTO
视频播放列表,其中许多被学术机构使用。这些可以是有趣的创造,是一个很好的方式回馈社会。
# 参与 Java 用户组
# 参与 Java 用户组
...
...
new/master-java11/18.md
浏览文件 @
4c8c6d85
...
@@ -11,14 +11,14 @@
...
@@ -11,14 +11,14 @@
7.
标识符。
7.
标识符。
8.
Java18.3(10)。
8.
Java18.3(10)。
9.
Java9、10(18.3)和 11(18.9)。
9.
Java9、10(18.3)和 11(18.9)。
10.
G1
号
。
10.
G1。
# 第 2 章
# 第 2 章
1.
当一个线程在一个队列中等待一个当前被锁定的对象时,它就被认为是在争夺这个锁
1.
当一个线程在一个队列中等待一个当前被锁定的对象时,它就被认为是在争夺这个锁
2.
代码缓存是
**Java 虚拟机**
(
**JVM**
)存储生成的本机代码的内存区域。
2.
代码缓存是
**Java 虚拟机**
(
**JVM**
)存储生成的本机代码的内存区域。
3.
`-XX:NonProfiledCodeHeapSize`
。
3.
`-XX:NonProfiledCodeHeapSize`
。
4.
Lint 和
docl
int 是向
`javac`
报告警告的来源。
4.
Lint 和
DocL
int 是向
`javac`
报告警告的来源。
5.
`hotspot/test/testlibrary/jit-tester`
。
5.
`hotspot/test/testlibrary/jit-tester`
。
6.
`-Xshare:off`
。
6.
`-Xshare:off`
。
7.
FXML 公司。
7.
FXML 公司。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录