《三分钟包会》Java 初学指♂男:“说说初学的误区与死结”( 壹 | 反射与 Field )

本贴最后更新于 2028 天前,其中的信息可能已经时移世异

🕐 莫要着急往下翻,倒计时闹钟正在加载中...

通常,我们这么给变量赋值:

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

题目要求:

  1. 根据 variable 变量中的字符串 name,找到和字符串名字相同的变量
  2. variable 字符串中指定变量的值修改为 DaMing
  3. 必须依靠字符串来修改该变量的值,而不是直接赋值
  4. 最终,变量 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;

Mainname 变量所属的类,调用 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(反射类, 值) 对其进行修改。

实战演练

题目

屏幕快照 2019-10-15 下午 11.15.55.png

我们要在 Main 类中修改在 Variable 类中的 name 变量。

打开你的 IDE,试一试吧。

答案

屏幕快照 2019-10-15 下午 11.18.20.png

⏰ 三分钟过去了,你学会了吗?

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • babyQ 1 评论

    这道题太难了,我不会!!!trollface

    大佬谦虚了~我瞎写的
    adlered
  • 其他回帖
  • JssDream 1

    挺好的啊,加油doge

  • someone 1
    作者

    这里不是 Bug,考虑到迁移的可用性,没有单独设立字段 😄

  • adlered 1 2 评论 via macOS

    哈哈哈哈哈,这个简单

    String a = "hello"; String b = a; a = null;

    JVM 会自动回收 a,搞定

    思路清晰明了,不过为啥让我想到了睡眠排序(滑稽)
    614756773
    @614756773 哈哈哈,可能是因为太简单粗暴了吧
    adlered
  • 查看全部回帖