File tree Expand file tree Collapse file tree 2 files changed +17
-6
lines changed Expand file tree Collapse file tree 2 files changed +17
-6
lines changed Original file line number Diff line number Diff line change
1
+ 《《《 [ 返回首页] ( ../README.md ) <br />
2
+ 《《《 [ 上一节] ( ../ch06/10_Summing_Up.md )
3
+
1
4
## 反射
2
5
3
- 反射是一组功能的术语,它允许程序检查自己的定义。 ` Java ` 中的反射在类浏览器,对象检查器,调试器,解释器,服务(如 `JavaBeans™ 和对象序列化)以及任何创建,检查或操作任意Java对象的工具中发挥作用。
6
+ 反射是一组功能的术语,它允许程序检查自己的定义。 ` Java ` 中的反射在类浏览器,对象检查器,调试器,解释器,服务(如 ` JavaBeans™ ` 和对象序列化)以及任何创建,检查或操作任意Java对象的工具中发挥作用。
4
7
5
8
` Java ` 自一开始就出现了反射,但泛型的出现改变了反射的两种重要方式,即为泛型的反射和反射引入了泛型。
6
9
7
10
通过泛型来进行反射,我们指的是用于反射的一些类型现在是泛型类型。特别是,类 ` Class ` 成为泛型类 ` Class<T> ` 。这看起来可能会让人感到困惑,但一旦明白它可以使得使用反射的程序更加清晰。类文字和方法 ` Object.getClass ` 使用特殊技巧来返回更精确的类型信息。泛型被用来在注释的反映中特别有效。我们观察到 ` Class<T> ` 中的类型参数 ` T ` 应该总是绑定到一个可定义类型,并且我们提供一个简短的库,可以帮助您避免许多常见的未经检查的强制转换。
8
11
9
12
通过对泛型的反思,我们的意思是反射现在返回有关泛型的信息。有一些新的接口可以表示泛型类型,包括类型变量,参数化类型和通配符类型,还有一些新的方法可以获得泛型类型的字段,构造函数和方法。
10
13
11
- 我们依次解释每一个点。我们不承担任何以前的反思知识,但我们专注于与泛型相关的方面。
14
+ 我们依次解释每一个点。我们不承担任何以前的反思知识,但我们专注于与泛型相关的方面。
15
+
16
+ 《《《 [ 下一节] ( 01_Generics_for_Reflection.md ) <br />
17
+ 《《《 [ 返回首页] ( ../README.md )
Original file line number Diff line number Diff line change
1
+ 《《《 [ 返回首页] ( ../README.md ) <br />
2
+ 《《《 [ 上一节] ( 00_Reflection.md )
3
+
1
4
## 反射的泛型
2
5
3
- ` Java ` 支持自 ` 1.0 ` 版以来的反射以及 ` 1.1 ` 版以后的类文字。 它们的核心是 ` Class ` 类,它表示运行时对象类型的信息。 您可以编写一个类型,后跟 ` .class ` 作为文字,表示与该类型相对应的类标记,并且方法 ` getClass ` 在每个对象上定义并返回一个类标记,该标记表示该对象在运行时携带的特定类型信息。 这里是一个例子:
6
+ ` Java ` 支持自 ` 1.0 ` 版以来的反射以及 ` 1.1 ` 版以后的类文字。 它们的核心是 ` Class ` 类,它表示运行时对象类型的信息。 您可以编写一个类型,后跟 ` .class ` 作为文字,表示与该类型相对应的类标记,并且方法 ` getClass ` 在每个对象上定义并返回一个类标记,该标记表示该对象在运行时携带的特定类型信息。 这里是一个例子:
4
7
5
8
``` java
6
9
Class ki = Integer . class;
9
12
assert ki == kn;
10
13
```
11
14
12
- 对于给定的类加载器,相同的类型总是由相同的类标记表示。为了强调这一点,在这里我们使用标识符(== 运算符)比较类标记。但是,在大多数情况下,使用相等 等于方法)。
15
+ 对于给定的类加载器,相同的类型总是由相同的类标记表示。为了强调这一点,在这里我们使用标识符(` == ` 运算符)比较类标记。但是,在大多数情况下,使用相等 等于方法)。
13
16
14
- ` Java 5 ` 中的一个变化是 ` Class ` 类现在接受一个类型参数,所以 `Class <T >是类型T的类标记的类型 。 前面的代码现在写成如下所示:
17
+ ` Java 5 ` 中的一个变化是 ` Class ` 类现在接受一个类型参数,所以 ` Class <T> ` 是类型 ` T ` 的类标记的类型 。 前面的代码现在写成如下所示:
15
18
16
19
``` java
17
20
Class<Integer > ki = Integer . class;
54
57
55
58
这种通用类型具有两个优点。 首先,这意味着调用结果不需要强制转换,因为泛型类型系统可以精确地指定正确的类型。 其次,这意味着如果您不小心使用类标记调用不是 ` Annotation ` 子类的类的方法,那么会在编译时而不是在运行时检测到。
56
59
57
- 类标记的另一种用法类似于注释类,它出现在 ` java.awt ` 包的 ` Component ` 类的 `getListeners`` 方法中:
60
+ 类标记的另一种用法类似于注释类,它出现在 ` java.awt ` 包的 ` Component ` 类的 ` getListeners ` 方法中:
58
61
59
62
``` java
60
63
public < T extends EventListener >
71
74
72
75
包装在编译时通过动态检查来补充静态检查,这对于提高安全性或与遗留代码的接口(见第 ` 8.1 ` 节)可能很有用。 该实现调用前面描述的类 ` Class ` 中的方法,其中接收方是传递到方法中的类标记,并且该转换将应用于使用 ` get ` ,` set ` 或 ` add ` 添加到列表中的任何元素,或者将其写入列表中。 然而,` Class<T> ` 的类型参数意味着 ` checkedList ` 的代码不需要额外的转换(除了调用类类中的 ` cast ` 方法外),并且编译器可以检查该方法是否使用类标记调用 一个合适的类型。
73
76
77
+ 《《《 [ 下一节] ( 02_Reflected_Types_are_Reifiable_Types.md ) <br />
78
+ 《《《 [ 返回首页] ( ../README.md )
74
79
75
80
76
81
You can’t perform that action at this time.
0 commit comments