Skip to content

Commit a968560

Browse files
authored
Update 05_Reflection_for_Generics.md
1 parent 12cb518 commit a968560

File tree

1 file changed

+65
-59
lines changed

1 file changed

+65
-59
lines changed

ch07/05_Reflection_for_Generics.md

+65-59
Original file line numberDiff line numberDiff line change
@@ -3,79 +3,85 @@
33

44
### 泛型的反思
55

6-
泛型以两种方式改变反射库。 我们已经讨论了反射的泛型,其中 `Java` 为类 `Class<T>` 添加了一个类型参数。 我们现在讨论泛型的反射,其中 `Java` 添加了支
7-
持访问泛型类型的方法和类
6+
泛型以两种方式改变反射库。我们已经讨论了反射的泛型,其中 `Java` 为类 `Class<T>` 添加了一个类型参数。我们现在讨论泛型的反射,其中 `Java` 添加了支持
7+
访问泛型类型的方法和类
88

9-
`7-2` 显示了泛型使用反射的简单演示。 它使用反射来查找与给定名称关联的类,并使用反射库类 `Field``Constructor``Method` 打印出与该类关联的字
10-
段,构造函数和方法。 两种不同的方法可用于将字段,构造函数或方法转换为用于打印的字符串:旧的 `toString` 方法和新的 `toGenericString` 方法。 旧方法
11-
主要是为了向后兼容性而维护的。 示例 `7-3` 中显示了一个小样本类,示例 `7-4` 中显示了使用此类运行的示例。
9+
`7-2` 显示了泛型使用反射的简单演示。它使用反射来查找与给定名称关联的类,并使用反射库类 `Field``Constructor``Method` 打印出与该类关联的字
10+
段,构造函数和方法。两种不同的方法可用于将字段,构造函数或方法转换为用于打印的字符串:旧的 `toString` 方法和新的 `toGenericString` 方法。 旧方法主
11+
要是为了向后兼容性而维护的。 示例 `7-3` 中显示了一个小样本类,示例 `7-4` 中显示了使用此类运行的示例。
1212

1313
`7-2`。 对泛型的反思
1414

1515
```java
16-
import java.lang.reflect.*;
17-
import java.util.*;
18-
class ReflectionForGenerics {
19-
public static void toString(Class<?> k) {
20-
System.out.println(k + " (toString)");
21-
for (Field f : k.getDeclaredFields())
22-
System.out.println(f.toString());
23-
for (Constructor c : k.getDeclaredConstructors())
24-
System.out.println(c.toString());
25-
for (Method m : k.getDeclaredMethods())
26-
System.out.println(m.toString());
27-
System.out.println();
28-
}
29-
public static void toGenericString(Class<?> k) {
30-
System.out.println(k + " (toGenericString)");
31-
for (Field f : k.getDeclaredFields())
32-
System.out.println(f.toGenericString());
33-
for (Constructor c : k.getDeclaredConstructors())
34-
System.out.println(c.toGenericString());
35-
for (Method m : k.getDeclaredMethods())
36-
System.out.println(m.toGenericString());
37-
System.out.println();
38-
}
39-
public static void main (String[] args) throws ClassNotFoundException {
40-
for (String name : args) {
41-
Class<?> k = Class.forName(name);
42-
toString(k);
43-
toGenericString(k);
44-
}
45-
}
46-
}
16+
import java.lang.reflect.*;
17+
import java.util.*;
18+
class ReflectionForGenerics {
19+
public static void toString(Class<?> k) {
20+
System.out.println(k + " (toString)");
21+
for (Field f : k.getDeclaredFields())
22+
System.out.println(f.toString());
23+
for (Constructor c : k.getDeclaredConstructors())
24+
System.out.println(c.toString());
25+
for (Method m : k.getDeclaredMethods())
26+
System.out.println(m.toString());
27+
System.out.println();
28+
}
29+
public static void toGenericString(Class<?> k) {
30+
System.out.println(k + " (toGenericString)");
31+
for (Field f : k.getDeclaredFields())
32+
System.out.println(f.toGenericString());
33+
for (Constructor c : k.getDeclaredConstructors())
34+
System.out.println(c.toGenericString());
35+
for (Method m : k.getDeclaredMethods())
36+
System.out.println(m.toGenericString());
37+
System.out.println();
38+
}
39+
public static void main (String[] args) throws ClassNotFoundException {
40+
for (String name : args) {
41+
Class<?> k = Class.forName(name);
42+
toString(k);
43+
toGenericString(k);
44+
}
45+
}
46+
}
4747
```
4848

4949
`7-3`。 示例类
5050

5151
```java
52-
class Cell<E> {
53-
private E value;
54-
public Cell(E value) { this.value=value; }
55-
public E getValue() { return value; }
56-
public void setValue(E value) { this.value=value; }
57-
public static <T> Cell<T> copy(Cell<T> cell) {
58-
return new Cell<T>(cell.getValue());
59-
}
60-
}
52+
class Cell<E> {
53+
private E value;
54+
public Cell(E value) {
55+
this.value=value;
56+
}
57+
public E getValue() {
58+
return value;
59+
}
60+
public void setValue(E value) {
61+
this.value=value;
62+
}
63+
public static <T> Cell<T> copy(Cell<T> cell) {
64+
return new Cell<T>(cell.getValue());
65+
}
66+
}
6167
```
6268

6369
`7-4`。 示例运行
6470

6571
```java
66-
% java ReflectionForGenerics Cell
67-
class Cell (toString)
68-
private java.lang.Object Cell.value
69-
public Cell(java.lang.Object)
70-
public java.lang.Object Cell.getValue()
71-
public static Cell Cell.copy(Cell)
72-
public void Cell.setValue(java.lang.Object)
73-
class Cell (toGenericString)
74-
private E Cell.value
75-
public Cell(E)
76-
public E Cell.getValue()
77-
public static <T> Cell<T> Cell.copy(Cell<T>)
78-
public void Cell.setValue(E)
72+
% java ReflectionForGenerics Cell
73+
class Cell (toString)
74+
private java.lang.Object Cell.value
75+
public Cell(java.lang.Object)
76+
public java.lang.Object Cell.getValue()
77+
public static Cell Cell.copy(Cell)
78+
public void Cell.setValue(java.lang.Object)
79+
class Cell (toGenericString)
80+
private E Cell.value
81+
public Cell(E)
82+
public E Cell.getValue()
83+
public static <T> Cell<T> Cell.copy(Cell<T>)
84+
public void Cell.setValue(E)
7985
```
8086

8187
示例运行表明,尽管对象和类标记的实体化类型信息不包含有关泛型的信息,但该类的实际字节码确实可以对有关泛型和擦除类型的信息进行编码。 关于泛型类型的信息
@@ -85,4 +91,4 @@
8591
部分解释如何访问它。
8692

8793
《《《 [下一节](06_Reflecting_Generic_Types.md) <br/>
88-
《《《 [返回首页](../README.md)
94+
《《《 [返回首页](../README.md)

0 commit comments

Comments
 (0)