java统一读取配置文件

java统一读取配置文件

本文主要介绍如何统一读取配置文件,然后在各个模块中使用。
比如,这是我们的配置文件:
aa=aa
main.code=adf
main.size=33
sub.code=subcolllll
sub.size=99
third.sub.code=aabbccdd

下面说一下这个配置文件的使用,也就是说在使用的时候,我们怎么去用这些参数。
public class XyConfig {

    public static String AA = "cccccc";

    public static class Main {
        public static String CODE = "maincode";
        public static int SIZE = 10;
    }

    public static class Sub {
        public static String CODE = "subcode";
        public static int SIZE = 12;
    }

    public static class Third {
        public static class Sub {
            public static String CODE = "123123123";
        }
    }
}

从上面的配置类中我们能够看到在使用这些参数的之后我们可以直接这样。
public static void main(String[] args) {
        System.out.println("============================");
        System.out.println(XyConfig.AA);
        System.out.println(XyConfig.Main.CODE);
        System.out.println(XyConfig.Main.SIZE);
        System.out.println(XyConfig.Sub.CODE);
        System.out.println(XyConfig.Sub.SIZE);
        System.out.println(XyConfig.Third.Sub.CODE);
        System.out.println("============================");
    }

这样能实现的效果是如果没有在配置文件中进行配置,那么读取的值就是系统已经配置的默认值,如果在配置文件中配置了,那么就是配置的值。具体的实现在下面。

好,下面上货。
XyConfig.java
public class XyConfig {

    public static String AA = "cccccc";

    public static class Main {
        public static String CODE = "maincode";
        public static int SIZE = 10;
    }

    public static class Sub {
        public static String CODE = "subcode";
        public static int SIZE = 12;
    }

    public static class Third {
        public static class Sub {
            public static String CODE = "123123123";
        }
    }
}

XyConfigInitializer.java
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.*;

public class XyConfigInitializer {
    private static final String CONFIGFILE = "config/config.properties";
    private static final String CLASSPREFIX = "com.xueyou.demo.config.xyconfig";

    /**
     * 读取配置文件
     */
    public static void init() {
        InputStream configInputStream;
        try {
            configInputStream = XyConfigInitializer.class.getClassLoader().getSystemClassLoader().getResourceAsStream(CONFIGFILE);
            Properties properties = new Properties();
            properties.load(configInputStream);
            initNextLevel(properties, XyConfig.class);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
    }

    public static void initNextLevel(Properties properties, Class nowClass) throws IllegalAccessException {
        String baseClassName = nowClass.getName().toLowerCase().replaceAll("\\$", "\\.");
        String shortName = baseClassName.replaceAll(CLASSPREFIX, "").replaceFirst("\\.", "");
        //key集合
        Set<Object> keys = properties.keySet();
        for (Field field : nowClass.getFields()) {
            if (Modifier.isPublic(field.getModifiers()) && Modifier.isStatic(field.getModifiers())) {
                String classParam = field.getName().toLowerCase();
                if (shortName.equals("")) {
                    if (keys.contains(classParam)) {
                        pushNewValue(classParam, properties, field);
                    }
                } else {
                    if (keys.contains(shortName + "." + classParam)) {
                        pushNewValue(shortName + "." + classParam, properties, field);
                    }
                }
            }
        }
        for (Class<?> aClass : nowClass.getClasses()) {
            initNextLevel(properties, aClass);
        }
    }

    public static void pushNewValue(String classParam, Properties properties, Field field) throws IllegalAccessException {
        String value = properties.getProperty(classParam);
        if (value != null) {
            Class<?> type = field.getType();
            if (type.equals(int.class))
                field.set(null, Integer.valueOf(value));
            else if (type.equals(String.class))
                field.set(null, value);
            else if (type.equals(long.class))
                field.set(null, Long.valueOf(value));
            else if (type.equals(boolean.class))
                field.set(null, Boolean.valueOf(value));
            else if (type.isEnum())
                field.set(null, Enum.valueOf((Class<Enum>) type, value.toUpperCase()));
        }
    }
}

测试类:
public class App {

    static {
        //读取配置信息
        XyConfigInitializer.init();
    }

    public static void main(String[] args) {
        System.out.println("============================");
        System.out.println(XyConfig.AA);
        System.out.println(XyConfig.Main.CODE);
        System.out.println(XyConfig.Main.SIZE);
        System.out.println(XyConfig.Sub.CODE);
        System.out.println(XyConfig.Sub.SIZE);
        System.out.println(XyConfig.Third.Sub.CODE);
        System.out.println("============================");
    }
}

这里需要注意的是,需要在初始化的时候调用初始化方法,也就是读取配置文件。

下面是运行结果:
============================
aa
adf
33
subcolllll
99
aabbccdd
============================


这里展示一下目录结构


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值