
🕐 莫要着急往下翻,倒计时闹钟正在加载中...
⏱
通常,我们这么给变量赋值:
String name = "XiaoMing";
name = "DaMing";
那么假如,我们不允许直接给 name 这个变量赋值,但我们提供与该变量名相同的字符串:
String name = "XiaoMing";
// variable 中指定了要修改的变量
String variable = "name";
// 将 variable 中指定的变量修改为 value 的值
String value = "DaMing";
// 不允许使用以下方法直接给 name 赋值:
// name = value;
// name = "DaMing";
// 要求最终, name 的值为 DaMing
题目要求:
- 根据
variable变量中的字符串name,找到和字符串名字相同的变量 - 将
variable字符串中指定变量的值修改为DaMing - 必须依靠字符串来修改该变量的值,而不是直接赋值
- 最终,变量
name的值应该是DaMing,而不应该去修改变量variable的值
⏱
想好了吗?让我们来实践一下吧!
public class Main {
// 定义 name 为静态变量,在启动时就被定义
public static String name = "XiaoMing";
public void Test() {
try {
System.out.println("修改前,name的值为:" + name);
String variable = "name";
String value = "DaMing";
// 获取 name 所在 Main 类的 Class 反射
Class clazz = Main.class;
// 通过getDeclaredField(String 变量名) 可以获得该类中指定变量的操作权
// 而 Field 就可以提供对变量的操作
Field field = clazz.getDeclaredField(variable);
// 也可以写为:
// Field field = clazz.getDeclaredField("name");
// 使用 field.set(Class反射类, 值) 可以将该变量修改为指定值
field.set(clazz, value);
// 也可以写为:
// field.set(clazz, "DaMing");
System.out.println("修改后,name的值为:" + name);
} catch (Exception e) {}
}
public static void main(String[] args) {
new Main().Test();
}
}
返回结果:
修改前,name的值为:XiaoMing
修改后,name的值为:DaMing
解析
public static String name = "XiaoMing";
name 是一个 公共的 静态变量,它的初始值是 XiaoMing。
String variable = "name";
String value = "DaMing";
要将 variable 中指定的变量名的值修改为 value 的值。
Class clazz = Main.class;
Main 是 name 变量所属的类,调用 XXX.class 可以返回一个 Class 反射类,但这里的 Class 反射类是完整的,我们可以访问其中所有的变量和方法,进行任意修改。
Field field = clazz.getDeclaredField(variable);
Class.getDeclaredField(变量名) 会返回一个 Field 类,这个 Field 类可以对我们指定的变量进行读写。
field.set(clazz, value);
field.set(反射类, 值) 可以将反射类之中,符合该 field 变量的变量值,修改为 value 中指定的值。
field 中存储了一个独立的变量,和 Class 没有关联。
只要任意类中含有和这个 field 中相同的变量,我们就可以直接使用 field.set(反射类, 值) 对其进行修改。
⏱
实战演练
题目

我们要在 Main 类中修改在 Variable 类中的 name 变量。
打开你的 IDE,试一试吧。
答案

⏰ 三分钟过去了,你学会了吗?
没有学会
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于