这里记录通过反射访问私有变量并赋值的方法。第一种是最普遍的,可以访问没有公开的私有变量。而后两种似乎有点多余,直接调用方法也行,权当记录一下后两种操作方法吧。
pre
User对象
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 38
| package reflect;
public class User { private int id; private String name; private String email; public User(int id, String name, String email) { super(); this.id = id; this.name = name; this.email = email; } 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; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; }
@Override public String toString() { return "User [id=" + id + ", name=" + name + ", email=" + email + "]"; } }
|
通过Field赋值
这种方法是通过获取Field,然后直接赋值。
例如:
1 2 3 4 5 6
| User user = new User(0, "tom", "111@11.cc"); Class clazz = user.getClass(); Field f = clazz.getDeclaredField("id"); f.setAccessible(true); f.setInt(user, 100); System.out.println(user);
|
结果:
1
| User [id=100, name=tom, email=111@11.cc]
|
通过Set方法赋值
这种方法是通过Class获取对应Field的Set方法(如果有的话),然后直接赋值。
1 2 3 4 5 6
| User user = new User(0, "tom", "111@11.cc"); Class clazz = user.getClass(); Field f = clazz.getDeclaredField("id"); Method me = clazz.getDeclaredMethod("setId", int.class); me.invoke(user, 123); System.out.println(user);
|
这里有一点值得注意的是:查找方法时,如果方法含有参数,则需要传入参数的类型,否则是找不到的。
通过PropertyDescriptor获取其Set方法
这里的方法可以直接通过方法名还获取该字段的set方法和get方法。
1 2 3 4 5 6
| User user = new User(0, "tom", "111@11.cc"); Class clazz = user.getClass(); PropertyDescriptor pro = new PropertyDescriptor("id", clazz); Method me = pro.getWriteMethod(); me.invoke(user, 999); System.out.println(user);
|