1. 利用反射访问java类私有变量
setAccessible(Boolean flag)可以跳过java语言的访问检查,使得私有变量可以被查询和设置
isAccessible()可以用来检测Field是否可以被访问
实例代码如下:
package com.yf.ssm.po;
import java.util.Date;
public class User {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
public User(Integer id, String username) {
super();
this.id = id;
this.username = username;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username == null ? null : username.trim();
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex == null ? null : sex.trim();
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address == null ? null : address.trim();
}
}
public static void testField() throws Exception, IllegalAccessException{
User user = new User(1,"name");
Class cl = user.getClass();
Field[] fields = cl.getDeclaredFields();
for(Field f: fields){
String name = f.getName();
System.out.println(name);
Boolean isAccessible = f.isAccessible();
System.out.println(isAccessible);
f.setAccessible(true);
isAccessible = f.isAccessible();
System.out.println(isAccessible);
Object obj = f.get(user);
System.out.println(obj);
System.out.println("-------");
}
}
运行结果
id
false
true
1
------
username
false
true
wuyifeng
------
birthday
false
true
null
------
sex
false
true
null
------
address
false
true
null
------
测试表明,可以访问并获取对象的私有成员变量(域 Field)
fob = field.get(Object obj)可以返回对象obj的field域的值(object对象)