反射获取私有数据问题

这里记录通过反射访问私有变量并赋值的方法。第一种是最普遍的,可以访问没有公开的私有变量。而后两种似乎有点多余,直接调用方法也行,权当记录一下后两种操作方法吧。

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);

Powered by Hexo and Hexo-theme-hiker

Copyright © 2019 - 2024 My Wonderland All Rights Reserved.

UV : | PV :