在java中如果类的成员变量设置为私有的,一般情况下是不允许直接访问这个变量的,但是有了反射之后,就可以直接获取该变量的名称和变量值
1. 访问成员变量
(1)先定义一个用户实体类
public class User {
private int id;
private String name;
private Date birth;
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
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;
}
}
(2)通过反射获取该类
/**动态加载类**/
Class clazz = Class.forName("org.entity.User");
/**获取类声明的变量**/
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
/**打印变量名**/
System.out.println(field.getName());
}
2. 访问成员变量值
(1)第一种方法,直接访问
public static void print() throws Exception{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
User user = new User();
user.setId(1);
user.setName("张三");
user.setBirth(sdf.parse("2017-08-16"));
Class clazz = user.getClass();
Field[] fs = clazz.getDeclaredFields();
for (Field field : fs) {
/**
如果成员变量是private的,则需要设置accessible为true
如果成员变量是public的,则不需要设置
**/
field.setAccessible(true);
System.out.println(field.get(user));
}
}
(2)第二种方法 调用变量的get方法
public static void print() throws Exception{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
User user = new User();
user.setId(1);
user.setName("张三");
user.setBirth(sdf.parse("2017-08-16"));
Class clazz = user.getClass();
Field[] fs = clazz.getDeclaredFields();
for (Field field : fs) {
/** 先获取变量名 **/
String fieldName = field.getName();
/**拼接get方法,如getId **/
String getMethod = "get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1,fieldName.length());
/**
调用clazz的getMethod方法获取类的指定get方法
通过invoke执行获取变量值
**/
System.out.println(clazz.getMethod(getMethod).invoke(user));
}
}