Java 反射:通过 getField() 设置公共全局变量
Java 通过 getField() 操作公共全局变量
以前写 JavaWeb 项目启动初始化系统配置全局变量的代码,都是 variable = Properties.getProperty(name)
这样一行一行代码的设置,变量少还好说,变量一多真的很磨叽。所以一直想通过 循环
简化代码,重构某个项目时无意间发现了 Java 反射中的 getField()
以及其他相关方法,节省了大量代码,所以在此记录一下。由于反射的 性能
问题,只在系统启动时初始化数据使用。
依赖工具类 PropertiesUtils
1package net.itanken.test.util;
2
3import java.util.Properties;
4
5public class PropertiesUtils {
6
7 private static Properties props = new Properties();
8
9 public static final String get(String key) {
10 return props.getProperty(key, "");
11 }
12
13 // 省略 Properties.load() 等其他相关代码
14}
全局配置类 Configuration
重点代码为 Configuration.class.getField(name).set(Configuration.class, value);
,在 foreach
循环中设置非空配置对应变量的值,.properties
文件中的 key
需与要设置的变量名一致。
1package net.itanken.test.basic;
2
3import net.itanken.test.util.PropertiesUtils;
4
5/**
6 * System Config
7 * @author T
8 * @since 20180530
9 */
10public class Configuration {
11
12 public static String sysName = "系统名称";
13
14 public static String sysVer = "系统版本";
15
16 public static String resVer = "静态资源版本";
17
18 public static String support = "技术支持";
19
20 public static String copyright = "版权声明";
21
22 public static final boolean initConfig() {
23 String[] names = new String[]{"sysName", "sysVer", "resVer", "support", "copyright"};
24
25 String value = null;
26 try {
27 for (String name : names) {
28 value = PropertiesUtils.get(name);
29 if (value.length() > 0) {
30 Configuration.class.getField(name).set(Configuration.class, value);
31 }
32 // System.out.println(name + "=" + Configuration.class.getField(name).get(Configuration.class));
33 }
34 } catch (Exception e) {
35 return false;
36 }
37 return true;
38 }
39
40}
测试结果
嗯,测试结果与 .properties
文件中的配置一致,OK。
1sysName=自定义系统显示名称
2sysVer=67.0.3396.62(正式版)
3resVer=20180530150546
4support=Technical support provided by StarSevenSky Studio.
5copyright=©2018 子兮子兮 版权所有
其他
Class.getField(String name)
方法用于获取由 public
修饰的公共成员字段,获取 private
修饰的私有成员字段可使用 Class.getDeclaredField(String name)
方法。
与之对应的获取 所有 公共成员字段 和 私有成员字段 的方法为 Class.getFields()
和 Class.getDeclaredFields()
。
另外从代码中可以看出,获取和设置字段值的方法分别为 get()
和 set()
。
PS. 以前对 getField 及其他相关方法并不了解,完全是依靠 IDE 的代码提示功能在偶然间发现的,多亏了我的 IDE。
内容声明 |
---|
本文链接:https://zixizixi.cn/java-reflection-getfield |
版权声明:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可,转载请保留此声明! |
相关文章
- java 登录 qq_Java实现QQ登录
- java 汉字乱码_Java中文乱码问题
- java 死链检测_网站死链检测工具/网站地图生成工具「建议收藏」
- 【说站】java反射机制提供哪些功能
- java 优先级队列_JAVA 队列
- uint32 java_关于Java的int和C的uint32之间的转换
- 大数据必学Java基础(六十九):IO流的深入了解
- java h2 数据库_Java H2数据库
- Java 代码审计基础知识 — java反射机制
- Java Base64加密与解密示例代码
- 【错误记录】Android Studio 4.2.1 编译报错 ( 设置支持的 Java 和 Kotlin 版本 | java.lang.BootstrapMethodError )
- java JNI: C 语言调用 Java 方法示例详解编程语言
- java ClassUtil 反射工具类详解编程语言
- java的多线程安全,ReentrantLock与synchronized锁详解编程语言
- 键处理 Java处理Redis过期键的实现方式(redisjava过期)
- 服务如何在Linux上快速关闭Java服务(linux关闭java)
- 策略解析Java中Redis过期策略(redisjava过期)
- 使用Redis优化Java开发的关键技巧(redis与java开发)
- Linux下Java命令:简介与基本用法(linux下java命令)
- 利用Redis锁实现Java程序并发控制(redis锁java实现)
- java反射应用详细介绍
- Java压缩文件ZIP实例代码