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

推荐订阅源

IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园_首页
H
Hackread – Cybersecurity News, Data Breaches, AI and More
T
ThreatConnect
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 聂微东
H
Help Net Security
T
Threat Research - Cisco Blogs
Blog — PlanetScale
Blog — PlanetScale
A
Arctic Wolf
G
Google Developers Blog
量子位
U
Unit 42
I
InfoQ
V
V2EX
F
Fox-IT International blog
P
Privacy & Cybersecurity Law Blog
V
Visual Studio Blog
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
C
CERT Recently Published Vulnerability Notes
博客园 - 三生石上(FineUI控件)
T
The Exploit Database - CXSecurity.com
T
Tailwind CSS Blog
SecWiki News
SecWiki News
Know Your Adversary
Know Your Adversary
MyScale Blog
MyScale Blog
宝玉的分享
宝玉的分享
The Hacker News
The Hacker News
Project Zero
Project Zero
Application and Cybersecurity Blog
Application and Cybersecurity Blog
月光博客
月光博客
Recent Commits to openclaw:main
Recent Commits to openclaw:main
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
GRAHAM CLULEY
C
Cisco Blogs
I
Intezer
Simon Willison's Weblog
Simon Willison's Weblog
O
OpenAI News
Recorded Future
Recorded Future
T
Tenable Blog
W
WeLiveSecurity
腾讯CDC
Stack Overflow Blog
Stack Overflow Blog
T
The Blog of Author Tim Ferriss
www.infosecurity-magazine.com
www.infosecurity-magazine.com
D
Docker
C
Cybersecurity and Infrastructure Security Agency CISA
PCI Perspectives
PCI Perspectives

技术改变视野

为程序员、设计师打造的摸鱼社区:摸鱼派! - 技术改变视野 我在 GitHub 上的开源项目 - 技术改变视野 为IDEA/Git配置GPG密钥,点亮GitHub Verified Commit标识 - 技术改变视野 从 SpringMVC 转为使用 SpringBoot —— 手把手带你使用 Intellij IDEA 最快速地搭建 SpringBoot+MyBatis(无 XML)+Thymeleaf - 技术改变视野 无题 - 技术改变视野 年轻人的第一辆京牌电动车 - 技术改变视野 我们忙碌且漫长的一生,有多久是为自己而活? 说说《后浪》 - 技术改变视野 离线使用 Google Fonts:让你的网站更精致 | goofoffline 神器,一键下载生成离线字体库! 🎨 适用于 Solo / Bolo 的清新高级主题 —— Sakura | 移植自 WordPress 主题 - 技术改变视野 大白话之Java级联调用:一个类,一条语句,同时调用好几个方法,串成一串 一个实例理解Java的接口(interface)用处与用法 一个实例带你理解JavaBean WebFilter-SpringBoot过滤器注解实例讲解 实例带你搞懂Java多线程&&线程池之(壹):线程池与多线程的关系和区别 实例带你搞懂Java多线程&&线程池之(贰):简单的线程池应用 实例带你获取多线程Thread的返回值之 (壹) - Callable的运行 实例带你学会简单的Java Thread多线程 实例带你获取多线程Thread的返回值之 (贰) - Callable配合线程池返回数据 一个实例理解Java Runnable多线程用处与用法 一个最简单的实例理解Semaphore在Java中的作用 从零开始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和短路运算符的妙用
大白话 | Java初学指♂男:“说说初学的误区与死结”( 壹 | 反射与Field ) - 技术改变视野
adlered · 2019-12-09 · 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