惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
有赞技术团队
有赞技术团队
www.infosecurity-magazine.com
www.infosecurity-magazine.com
大猫的无限游戏
大猫的无限游戏
爱范儿
爱范儿
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threatpost
V
Visual Studio Blog
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - Franky
人人都是产品经理
人人都是产品经理
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
The Cloudflare Blog
N
News and Events Feed by Topic
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
AWS News Blog
AWS News Blog
S
SegmentFault 最新的问题
T
Tailwind CSS Blog
Hugging Face - Blog
Hugging Face - Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Spread Privacy
Spread Privacy
J
Java Code Geeks
博客园 - 聂微东
T
Tor Project blog
宝玉的分享
宝玉的分享
博客园 - 叶小钗
Webroot Blog
Webroot Blog
博客园 - 【当耐特】
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
H
Heimdal Security Blog
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
MongoDB | Blog
MongoDB | Blog
I
InfoQ
Security Latest
Security Latest
Martin Fowler
Martin Fowler
Hacker News: Ask HN
Hacker News: Ask HN
P
Privacy International News Feed
C
CERT Recently Published Vulnerability Notes
Latest news
Latest news
雷峰网
雷峰网
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cisco Blogs
H
Help Net Security
L
LINUX DO - 最新话题
L
LINUX DO - 热门话题

技术改变视野

为程序员、设计师打造的摸鱼社区:摸鱼派! - 技术改变视野 大白话之耦合性:什么是耦合性和内聚性?用编程语言实例讲解! - 技术改变视野 🎨 适用于 Solo / Bolo 的清新高级主题 —— Sakura | 移植自 WordPress 主题 - 技术改变视野 我在 GitHub 上的开源项目 - 技术改变视野 为IDEA/Git配置GPG密钥,点亮GitHub Verified Commit标识 - 技术改变视野 从 SpringMVC 转为使用 SpringBoot —— 手把手带你使用 Intellij IDEA 最快速地搭建 SpringBoot+MyBatis(无 XML)+Thymeleaf - 技术改变视野 无题 - 技术改变视野 年轻人的第一辆京牌电动车 - 技术改变视野 我们忙碌且漫长的一生,有多久是为自己而活? - 技术改变视野 一个最简单的实例理解Semaphore在Java中的作用 - 技术改变视野 说说《后浪》 - 技术改变视野 离线使用 Google Fonts:让你的网站更精致 | goofoffline 神器,一键下载生成离线字体库! - 技术改变视野 实例带你学会简单的Java Thread多线程 - 技术改变视野 一个实例理解Java的接口(interface)用处与用法 - 技术改变视野 一个实例带你理解JavaBean - 技术改变视野 WebFilter-SpringBoot过滤器注解实例讲解 - 技术改变视野 实例带你搞懂Java多线程&&线程池之(壹):线程池与多线程的关系和区别 - 技术改变视野 实例带你搞懂Java多线程&&线程池之(贰):简单的线程池应用 - 技术改变视野 实例带你获取多线程Thread的返回值之 (壹) - Callable的运行 - 技术改变视野 实例带你获取多线程Thread的返回值之 (贰) - Callable配合线程池返回数据 - 技术改变视野 一个实例理解Java Runnable多线程用处与用法 - 技术改变视野 从零开始OpenSSL之 (壹) - 使用genrsa、rsa、rsautl生成公私钥 - 技术改变视野 从零开始 OpenSSL 之 (贰) - 使用 rsautl 解密文件 - 技术改变视野 大白话之Docker(壹):快速入门&&简单官方实例 - 技术改变视野 大白话之Docker(贰):简单部署一个Tomcat服务并发布内容 - 技术改变视野 大白话之从零讲解DVWA(壹)-SQL注入(SQL Injection) Low Level - 技术改变视野 大白话之从零讲解DVWA(贰)-SQL注入(SQL Injection) Medium/High Level - 技术改变视野 Java日志插件-Slog4J下载 - 技术改变视野 大白话之必会Java Atomic | 线程一点也不安全(一):比自增和synchronized更快速、靠谱的原子操作(调用C语言) - 技术改变视野 Log-MySQL root用户登录后无法查看数据库全部表/正常访问数据库 Access denied for user 'root'@'localhost' to database - 技术改变视野 大白话之Docker(叁):制作一个运行Tomcat服务端的Docker镜像 - 技术改变视野 Github仅保留指定文件/文件夹当前Commit,删除所有历史记录,清除「敏感信息」 - 技术改变视野 将Tomcat、MySQL从Linux迁移到Windows的心路历程(干货):令人恐惧的字符编码 - 技术改变视野 Spring: java.lang.NoSuchMethodError: clearCache | ClassNotFoundException | Error during artifact deployment 思路及解决办法 - 技术改变视野 大白话之Java反射-初学最迷的概念:能干啥?咋用? - 技术改变视野 大白话之Java面向接口编程:最“正经”的中文实例讲解,看不懂来打我! - 技术改变视野 大白话 | 课堂实践:使用Iterator对数组进行遍历 - 技术改变视野 大白话之fail-fast | fail-safe:为什么会有这个机制?它有什么作用? - 技术改变视野 刨根问底 | 大白话:在使用注解后,框架是怎么知道你哪个方法使用了注解的?用@RequestMapping注解举例详解! - 技术改变视野 大白话之必会Java Atomic | 线程一点也不安全(二):Atomic的ABA问题会导致什么情况?如何解决? - 技术改变视野 随笔 | 奇淫技巧 | Java:记return和短路运算符的妙用 - 技术改变视野 随笔 | Tomcat:续-从Linux迁移到Windows编码问题彻底解决 - 技术改变视野 大白话之AutoClosable接口 | try-with-resources:JDK1.7的新特性,提高重复回收效率 - 技术改变视野 大白话之Java多线程join方法:开局一张图,试学一分钟,你就费和我一样,理解介个方法 - 技术改变视野 大白话之Java Stream流:将类数组流化,便捷批量修改,通俗讲解! - 技术改变视野 Java 困扰三周の问题:使用byte[]或skip()方法读取字节流Stream文件尾部多/少/缺字节解决方法 - 技术改变视野 大白话之Java级联调用:一个类,一条语句,同时调用好几个方法,串成一串 - 技术改变视野
大白话 | Java初学指♂男:“说说初学的误区与死结”( 壹 | 反射与Field ) - 技术改变视野
adlered · 2022-12-16 · via 技术改变视野

思考

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

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