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

本贴最后更新于 2158 天前,其中的信息可能已经斗转星移

java-reflection-getfield

Java 通过 getField() 操作公共全局变量

以前写 JavaWeb 项目启动初始化系统配置全局变量的代码,都是 variable = Properties.getProperty(name) 这样一行一行代码的设置,变量少还好说,变量一多真的很磨叽。所以一直想通过 循环 简化代码,重构某个项目时无意间发现了 Java 反射中的 getField() 以及其他相关方法,节省了大量代码,所以在此记录一下。由于反射的 性能 问题,只在系统启动时初始化数据使用。

依赖工具类 PropertiesUtils

package net.itanken.test.util;

import java.util.Properties;

public class PropertiesUtils {

    private static Properties props = new Properties();

    public static final String get(String key) {
        return props.getProperty(key, "");
    }
	
    // 省略 Properties.load() 等其他相关代码
}

全局配置类 Configuration

重点代码为 Configuration.class.getField(name).set(Configuration.class, value);,在 foreach 循环中设置非空配置对应变量的值,.properties 文件中的 key 需与要设置的变量名一致。

package net.itanken.test.basic;

import net.itanken.test.util.PropertiesUtils;

/**
 * System Config
 * @author T
 * @since 20180530
 */
public class Configuration {

    public static String sysName = "系统名称";

    public static String sysVer = "系统版本";

    public static String resVer = "静态资源版本";

    public static String support = "技术支持";

    public static String copyright = "版权声明";

    public static final boolean initConfig() {
        String[] names = new String[]{"sysName", "sysVer", "resVer", "support", "copyright"};

        String value = null;
        try {
            for (String name : names) {
                value = PropertiesUtils.get(name);
                if (value.length() > 0) {
                    Configuration.class.getField(name).set(Configuration.class, value);
                }
                // System.out.println(name + "=" + Configuration.class.getField(name).get(Configuration.class));
            }
        } catch (Exception e) {
            return false;
        }
        return true;
    }

}

测试结果

嗯,测试结果与 .properties 文件中的配置一致,OK。

sysName=自定义系统显示名称
sysVer=67.0.3396.62(正式版)
resVer=20180530150546
support=Technical support provided by StarSevenSky Studio.
copyright=©2018 子兮子兮 版权所有

其他

Class.getField(String name) 方法用于获取由 public 修饰的公共成员字段,获取 private 修饰的私有成员字段可使用 Class.getDeclaredField(String name) 方法。
与之对应的获取 所有 公共成员字段 和 私有成员字段 的方法为 Class.getFields()Class.getDeclaredFields()
另外从代码中可以看出,获取和设置字段值的方法分别为 get()set()

PS. 以前对 getField 及其他相关方法并不了解,完全是依靠 IDE 的代码提示功能在偶然间发现的,多亏了我的 IDE。

内容声明 @Seves
本文链接:https://zixizixi.cn/
版权说明:本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
本文发布于 子兮子兮 个人博客,欢迎转载,但未经作者同意请在页面明显位置保留此声明,谢谢。
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3453 回帖 • 203 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • 反射
    19 引用 • 29 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • imagepng
    性能?

    1 回复
  • iTanken

    性能 trollface

  • 我和你的理解不同,你这样等于在配置文件写完了以后,又要在 一个 class 中 把它的 key 值再写一遍,那还不如用一个静态常量类来作为全局的配置。 另外,现在我用 springboot 的话,读配置文件可以用注解 @Value

  • @Value("${zzp.height}") 类似与这样的,东西。 仅说出自己的看法,没别的意思

    1 回复
  • iTanken

    这是用了 SpringBoot ?我们公司的项目一般都没有用第三方框架 😂

    1 回复
  • 我不知道这个是不是 springboot 才有的,不过我是在用 springboot 以后才这么去配置文件里的值。我觉得这样就方便多了。

  • someone9891 1

    我觉得你这样去反射的话,其实也可以自己去实现 @Value 这个注解同样的功能,自定义个注解,然后扫描到的时候再去加载对应的配置文件值也是可以的

    1 回复
  • iTanken

    好的,谢谢,又长知识了 trollface

请输入回帖内容 ...