一些Java反射API的例子。
1.显示所有字段和数据类型
使用反射遍历一个类声明的所有字段。
CompanyA.java
01 |
package com.mkyong.test;
|
02 |
03 |
import java.util.List;
|
04 |
import java.util.Map;
|
05 |
import java.util.Set;
|
06 |
07 |
public class CompanyA {
|
08 |
09 |
String orgName;
|
10 |
int count;
|
11 |
List<String> comments;
|
12 |
Set<String> branches;
|
13 |
Map<String, String> extra;
|
14 |
15 |
//...
|
16 |
} |
使用Java反射APIs getDeclaredFields()去遍历和打印字段名和数据类型。
Test.java
01 |
package com.mkyong.test;
|
02 |
03 |
import java.lang.reflect.Field;
|
04 |
import java.util.List;
|
05 |
06 |
public class Test {
|
07 |
08 |
public static void main(String[] args) {
|
09 |
10 |
Field[] fields = CompanyA. class .getDeclaredFields();
|
11 |
for (Field f : fields){
|
12 |
Class t = f.getType();
|
13 |
System.out.println( "field name : " + f.getName() + " , type : " + t);
|
14 |
}
|
15 |
16 |
}
|
17 |
18 |
} |
输出
1 |
field name : orgName , type : class java.lang.String
|
2 |
field name : count , type : int
|
3 |
field name : comments , type : interface java.util.List
|
4 |
field name : branches , type : interface java.util.Set
|
5 |
field name : extra , type : interface java.util.Map
|
2.获取指定数据类型的字段
下面的例子会获取所有List类型的字段。
Test.java
01 |
package com.mkyong.test;
|
02 |
03 |
import java.lang.reflect.Field;
|
04 |
import java.util.ArrayList;
|
05 |
import java.util.List;
|
06 |
07 |
public class TestAbc {
|
08 |
09 |
public static void main(String[] args) {
|
10 |
11 |
List<String> list = getFieldNameWithListDataType();
|
12 |
for (String data : list){
|
13 |
System.out.println( "List : " + data);
|
14 |
}
|
15 |
16 |
}
|
17 |
18 |
private static List<String> getFieldNameWithListDataType(){
|
19 |
20 |
List<String> result = new ArrayList<>();
|
21 |
22 |
//CompanyA, refer 1.1
|
23 |
Field[] fields = CompanyA. class .getDeclaredFields();
|
24 |
for (Field f : fields){
|
25 |
26 |
// use equals to compare the data type.
|
27 |
if (f.getType().equals(List. class )){
|
28 |
result.add(f.getName());
|
29 |
}
|
30 |
31 |
//for other data type
|
32 |
33 |
//Map
|
34 |
//if(f.getType().equals(Map.class))
|
35 |
36 |
//Set
|
37 |
//if(f.getType().equals(Set.class))
|
38 |
39 |
//primitive int
|
40 |
//if(f.getType().equals(int.class))
|
41 |
//if(f.getType().equals(Integer.TYPE))
|
42 |
43 |
//primitive long
|
44 |
//if(f.getType().equals(long.class))
|
45 |
//if(f.getType().equals(Long.TYPE))
|
46 |
47 |
}
|
48 |
49 |
return result;
|
50 |
51 |
}
|
52 |
53 |
} |
输出
1 |
comments |
Note
对于一些基本数据类型像int,你可以对比一下使用int.class或Integer.TYPE。
References
1.Oracle : Java Reflection examples
2.Oracle : Class – getDeclaredFields Javadoc
时间: 2024-10-24 00:29:48