3

大白话 | Java初学指♂男:“说说初学的误区与死结”( 壹 | 反射与Field )

 2 years ago
source link: https://www.stackoverflow.wiki/blog/articles/2019/10/14/1571061168019.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
2019-10-14 / 2019-12-09 / 初学指男   大白话  

大白话 | Java初学指♂男:“说说初学的误区与死结”( 壹 | 反射与Field )

100

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

1String name = "XiaoMing";
2name = "DaMing";

那么假如,我们不允许直接给name这个变量赋值,但我们提供与该变量名相同的字符串

 1String name = "XiaoMing";
 2
 3// variable 中指定了要修改的变量
 4String variable = "name";
 5
 6// 将 variable 中指定的变量修改为 value 的值
 7String value = "DaMing";
 8
 9// 不允许使用以下方法直接给 name 赋值:
10// name = value;
11// name = "DaMing";
12// 要求最终, name 的值为 DaMing

题目要求:

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

想好了吗?让我们来看看下方的题解:

 1public class Main {
 2    // 定义 name 为静态变量,在启动时就被定义
 3    public static String name = "XiaoMing";
 4
 5    public void Test() {
 6        try {
 7
 8            System.out.println("修改前,name的值为:" + name);
 9
10            String variable = "name";
11            String value = "DaMing";
12
13            // 获取 name 所在 Main 类的 Class 反射
14            Class clazz = Main.class;
15
16            // 通过getDeclaredField(String 变量名) 可以获得该类中指定变量的操作权
17            // 而 Field 就可以提供对变量的操作
18            Field field = clazz.getDeclaredField(variable);
19	    // 也可以写为:
20	    // Field field = clazz.getDeclaredField("name");
21
22            // 使用 field.set(Class反射类, 值) 可以将该变量修改为指定值
23            field.set(clazz, value);
24            // 也可以写为:
25            // field.set(clazz, "DaMing");
26
27            System.out.println("修改后,name的值为:" + name);
28
29        } catch (Exception e) {}
30    }
31
32    public static void main(String[] args) {
33        new Main().Test();
34    }
35
36}

返回结果:

1修改前,name的值为:XiaoMing
2修改后,name的值为:DaMing
1public static String name = "XiaoMing";

name是一个公共的 静态变量,它的初始值是XiaoMing

1String variable = "name";
2String value = "DaMing";

要将variable中指定的变量名的值修改为value的值。

1Class clazz = Main.class;

Mainname变量所属的类,调用XXX.class可以返回一个Class反射类,但这里的Class反射类是完整的,我们可以访问其中所有的变量和方法,进行任意修改。

1Field field = clazz.getDeclaredField(variable);

Class.getDeclaredField(变量名)会返回一个Field类,这个Field类可以对我们指定的变量进行读写。

1field.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

如转载请在文章尾部添加

原作者来自 adlered 个人技术博客:https://www.stackoverflow.wiki/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK