以下只是了解Field的用法,以下代码参考的点击打开链接
java 中getDeclaredFields() 与getFields() 的区别
getDeclaredFields()返回Class中所有的字段,包括私有字段。例证:
java代码
package com.test.bean;
import java.sql.Timestamp;
public class Person2 {
private int id;
private int age;
private String personName;
private Timestamp birthdate;
public String identitify;
protected String address;
String phone;
}
@Test
public void test_getDeclaredFields() {
Field[]fields=Person2.class.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
System.out.println(field.getName());
}
}
运行结果:
id
age
personName
birthdate
identitify
address
phone
getFields 只返回公共字段,即有public修饰的字段。例证:
public void test_getDeclaredFields() {
Field[]fields=Person2.class.getFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
System.out.println(field.getName());
}
}
运行结果如下:
identitify
总结:
(1)getDeclaredFields()返回Class中所有的字段,包括私有字段;
(2)getFields 只返回公共字段,即有public修饰的字段
Field.setAccessible()方法的用法
java代码中,常常将一个类的成员变量置为private
在类的外面获取此类的私有成员变量的value时,需要设置setAccessible方法
例如:
这是一个外部类User
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Class clazz = null;
User user = new User();
user.setId(11);
user.setName("ruin");
try {
clazz = Class.forName("com.xyz.User");
for(Field field:clazz.getDeclaredFields()){
field.setAccessible(true);
System.out.println(field.get(user));
}
} catch (Exception e) {
e.printStackTrace();
}
运行结果是
11
ruin
如果去掉这个方法
Class clazz = null;
User user = new User();
user.setId(11);
user.setName("ruin");
try {
clazz = Class.forName("com.xyz.User");
for(Field field:clazz.getDeclaredFields()){
// field.setAccessible(true);
System.out.println(field.get(user));
}
} catch (Exception e) {
e.printStackTrace();
}
运行结果是
Class com.xyz.Test can not access a member of class com.xyz.User with modifiers "private"