zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Java 反射:通过 getField() 设置公共全局变量

JAVA反射 设置 通过 公共 全局变量
2023-06-13 09:11:39 时间

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 国际许可协议 进行许可,转载请保留此声明!