java反射的基本使用

之前在项目中遇到了一个把 List 输出称 HTML 的 Table 的需求,虽然最后没有采用,不过正好记录一下自己的学习内容。

其实如果 List 传入的类是固定的话,可以很简单的实现。不过我想写一个接口,传入 Template 类的形式,这样不管传入的是什么实体类,都可以输出成 HTML 表格的形式了。

不过以接口的形式呈现,就需要通过反射获取传入实体类的属性,因为不知道会传入哪些类,这些类有哪些属性。

完成这个接口的方式是调用这个方法时,传入 List 和 实体类的类名。就像这样:

1
public void printClass(List<T> list,String className);

然后主要使用 Field.getName() 的方法获取属性名和 Field.get(class) 内容值.

下面是接口实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public String printClass(List<T> list,String className){
String htmlstr="";
Object object = Class.forName(className).newInstance();
Class c = object.getClass();
Field[] fields = c.getDeclaredFields(); //获取T类的所有属性

for(Field field:fields){
field.setAccessible(true); //暴力的解除了私有限定
}

//html字符串拼接,并且把实体类的属性名作为表头
htmlstr += "<table><tr>";
for (Field field : fields) {
try {
htmlstr += "<th>" + field.getName() + "</th>"; //获取属性名
} catch (Exception e) {
e.printStackTrace();
}
}
htmlstr+="</tr>";

//获取实体类的属性值并作为表内容
for (T t : list) {
htmlstr += "<tr>";
for (Field field : fields) {
try {
htmlstr += "<td>" + field.get(t) + "</td>"; //获取类t当前field(属性名)的属性值
} catch (Exception e) {
e.printStackTrace();
}
}
htmlstr += "</tr>";
}

htmlstr += "</table>"; //有头有尾
return htmlstr;
}