大白话 | Java初学指♂男:“说说初学的误区与死结”( 壹 | 反射与Field )
思考
通常,我们这么给变量赋值:
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
题目要求:
- 根据
variable
变量中的字符串name
,找到和字符串名字相同的变量 - 将
variable
字符串中指定变量的值修改为DaMing
- 必须依靠字符串来修改该变量的值,而不是直接赋值
- 最终,变量
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;
Main
是name
变量所属的类,调用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(反射类, 值)
对其进行修改。
实战
实战演练
题目
我们要在Main
类中修改在Variable
类中的name
变量。
打开你的IDE,试一试吧。
答案
如转载请在文章尾部添加:
原作者来自 adlered 个人技术博客:https://www.stackoverflow.wiki/
大佬,你的缩略图裂了
写得真好
歪瑞古德
https://github.com/AdlerED/bolo-solo
基于 Solo,我们自己改写的 bolo 菠萝博客系统,欢迎体验~
大佬,你博客的评论系统是怎么搞的?挺好用的
大佬
👍
这里不是Bug,考虑到迁移的可用性,没有单独设立字段 😄
大佬,我用你的bolo本地搭建了博客试了一下,发现初始化的时候,管理员密码跑到b3key字段去了,是不是一个bug,还是我的姿势不对,因为可以登录,但是字段不对应
加油~你是最胖的
你太帅了
评论
我枯了