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
============================
这里展示一下目录结构