From 400e96d81dbbfd0efcc0228ae3c43b64ef5e9b2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E9=9B=81=E9=91=AB?= Date: Thu, 27 Feb 2020 19:03:19 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=BF=BD=E8=B7=AF->=E5=BF=BD=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/book/15-Exceptions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/book/15-Exceptions.md b/docs/book/15-Exceptions.md index 653b548d..5ee290bb 100644 --- a/docs/book/15-Exceptions.md +++ b/docs/book/15-Exceptions.md @@ -206,7 +206,7 @@ MyException: Originated in g() FullConstructors.main(FullConstructors.java:24) ``` -新增的代码非常简短:两个构造器定义了 MyException 类型对象的创建方式。对于第二个构造器,使用 super 关键宇明确调用了其基类构造器,它接受一个字符串作为参数。 +新增的代码非常简短:两个构造器定义了 MyException 类型对象的创建方式。对于第二个构造器,使用 super 关键字明确调用了其基类构造器,它接受一个字符串作为参数。 在异常处理程序中,调用了在 Throwable 类声明(Exception 即从此类继承)的 printStackTrace() 方法。就像从输出中看到的,它将打印“从方法调用处直到异常抛出处”的方法调用序列。这里,信息被发送到了 System.out,并自动地被捕获和显示在输出中。但是,如果调用默认版本: @@ -2068,7 +2068,7 @@ try { 如果想把“被检查的异常”这种功能“屏蔽”掉的话,这看上去像是一个好办法。不用“吞下”异常,也不必把它放到方法的异常说明里面,而异常链还能保证你不会丢失任何原始异常的信息。 -这种技巧给了你一种选择,你可以不写 try-catch 子句和/或异常说明,直接忽路异常,让它自己沿着调用栈往上“冒泡”,同时,还可以用 getCause() 捕获并处理特定的异常,就像这样: +这种技巧给了你一种选择,你可以不写 try-catch 子句和/或异常说明,直接忽略异常,让它自己沿着调用栈往上“冒泡”,同时,还可以用 getCause() 捕获并处理特定的异常,就像这样: ```java // exceptions/TurnOffChecking.java From a653a6383a340c05afd963a376e4d61cb895db6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E9=9B=81=E9=91=AB?= Date: Fri, 28 Feb 2020 22:05:39 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=B7=B3=E8=BD=AC?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/book/19-Type-Information.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/book/19-Type-Information.md b/docs/book/19-Type-Information.md index dd6514ce..773d88ae 100644 --- a/docs/book/19-Type-Information.md +++ b/docs/book/19-Type-Information.md @@ -1348,7 +1348,7 @@ x.getClass().equals(Derived.class)) true ### 类方法提取器 -通常,你不会直接使用反射工具,但它们可以帮助你创建更多的动态代码。反射是用来支持其他 Java 特性的,例如对象序列化(参见[附录:对象序列化](#ch040.xhtml#appendix-object-serialization))。但是,有时动态提取有关类的信息很有用。 +通常,你不会直接使用反射工具,但它们可以帮助你创建更多的动态代码。反射是用来支持其他 Java 特性的,例如对象序列化(参见[附录:对象序列化](https://lingcoder.github.io/OnJava8/#/book/Appendix-Object-Serialization))。但是,有时动态提取有关类的信息很有用。 考虑一个类方法提取器。查看类定义的源代码或 JDK 文档,只显示*在该类定义中*定义或重写的方法。但是,可能还有几十个来自基类的可用方法。找到它们既单调又费时[^1]。幸运的是,反射提供了一种方法,可以简单地编写一个工具类自动地向你展示所有的接口: From 8729f5c259d2e8ee350cd382306837e30add079d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E9=9B=81=E9=91=AB?= Date: Tue, 3 Mar 2020 13:19:18 +0800 Subject: [PATCH 3/5] fix Class.getInterface() -> Class.getInterfaces() --- docs/book/19-Type-Information.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/book/19-Type-Information.md b/docs/book/19-Type-Information.md index 773d88ae..98af551f 100644 --- a/docs/book/19-Type-Information.md +++ b/docs/book/19-Type-Information.md @@ -252,7 +252,7 @@ Canonical name : typeinfo.toys.Toy `printInfo()` 函数使用 `getName()` 来产生完整类名,使用 `getSimpleName()` 产生不带包名的类名,`getCanonicalName()` 也是产生完整类名(除内部类和数组外,对大部分类产生的结果与 `getName()` 相同)。`isInterface()` 用于判断某个 `Class` 对象代表的是否为一个接口。因此,通过 `Class` 对象,你可以得到关于该类型的所有信息。 -在主方法中调用的 `Class.getInterface()` 方法返回的是存放 `Class` 对象的数组,里面的 `Class` 对象表示的是那个类实现的接口。 +在主方法中调用的 `Class.getInterfaces()` 方法返回的是存放 `Class` 对象的数组,里面的 `Class` 对象表示的是那个类实现的接口。 另外,你还可以调用 `getSuperclass()` 方法来得到父类的 `Class` 对象,再用父类的 `Class` 对象调用该方法,重复多次,你就可以得到一个对象完整的类继承结构。 From cfa16bee91618b7a4980f4d4be57fb45ed83c418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E9=9B=81=E9=91=AB?= Date: Tue, 3 Mar 2020 14:53:16 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=90=A6=E8=80=85=20->=20=E5=90=A6?= =?UTF-8?q?=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/book/19-Type-Information.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/book/19-Type-Information.md b/docs/book/19-Type-Information.md index 98af551f..580a0a3a 100644 --- a/docs/book/19-Type-Information.md +++ b/docs/book/19-Type-Information.md @@ -501,7 +501,7 @@ public class DynamicSupplier implements Supplier { 14 ``` -注意,这个类必须假设与它一起工作的任何类型都有一个无参构造器,否者运行时会抛出异常。编译期对该程序不会产生任何警告信息。 +注意,这个类必须假设与它一起工作的任何类型都有一个无参构造器,否则运行时会抛出异常。编译期对该程序不会产生任何警告信息。 当你将泛型语法用于 `Class` 对象时,`newInstance()` 将返回该对象的确切类型,而不仅仅只是在 `ToyTest.java` 中看到的基类 `Object`。然而,这在某种程度上有些受限: From 32b5603531247a202ddc3b07c7548c018924cf27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E9=9B=81=E9=91=AB?= Date: Tue, 3 Mar 2020 15:02:34 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E7=BC=96=E8=AF=91=E6=9C=9F=20->=20?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E5=99=A8=20=EF=BC=8C=E5=8E=9F=E6=96=87"the?= =?UTF-8?q?=20compiler=20will=20only=20allow=20you=20to=20say=20that=20the?= =?UTF-8?q?=20superclass=20reference=20is=20=E2=80=9Csome=20class=20that?= =?UTF-8?q?=20is=20a=20superclass=20of=20FancyToy=E2=80=9D=20a"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/book/19-Type-Information.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/book/19-Type-Information.md b/docs/book/19-Type-Information.md index 580a0a3a..6fbc8795 100644 --- a/docs/book/19-Type-Information.md +++ b/docs/book/19-Type-Information.md @@ -527,7 +527,7 @@ public class GenericToyTest { } ``` -如果你手头的是超类,那编译期将只允许你声明超类引用为“某个类,它是 `FancyToy` 的超类”,就像在表达式 `Class` 中所看到的那样。而不会接收 `Class` 这样的声明。这看上去显得有些怪,因为 `getSuperClass()` 方法返回的是基类(不是接口),并且编译器在编译期就知道它是什么类型了(在本例中就是 `Toy.class`),而不仅仅只是"某个类"。不管怎样,正是由于这种含糊性,`up.newInstance` 的返回值不是精确类型,而只是 `Object`。 +如果你手头的是超类,那编译器将只允许你声明超类引用为“某个类,它是 `FancyToy` 的超类”,就像在表达式 `Class` 中所看到的那样。而不会接收 `Class` 这样的声明。这看上去显得有些怪,因为 `getSuperClass()` 方法返回的是基类(不是接口),并且编译器在编译期就知道它是什么类型了(在本例中就是 `Toy.class`),而不仅仅只是"某个类"。不管怎样,正是由于这种含糊性,`up.newInstance` 的返回值不是精确类型,而只是 `Object`。 ### `cast()` 方法