使用commons-configuration2实现xml文件读取为对象

最近由于规范文件读写,所以需要实现对xml文件进行读取。
本文只是使用commons-configuration2包对xml文件读取。
目前网上介绍的大多都是简单的读取xml文件中的具体字段,甚至官方文档也是简单的进行了介绍。
如果需要直接将xml文件转换成javaBean则需要进行复杂的操作,或者是通过具体的javaBean内进行解析,才能实现。

通过网上搜集资料,发现commons-digester3,能够对javaBean解析。但是,每个对象的解析规则则要进行具体实现。
而本文,通过java的反射机制,实现了通过定义与xml文件对应的javaBean,进行直接转换。

1。首先导入依赖包。如果是maven管理则直接使用如下:

        <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-digester3</artifactId>
          <version>3.2</version>
          <classifier>with-deps</classifier>
        </dependency>

2.具体实现:



import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.configuration2.XMLConfiguration;
import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
import org.apache.commons.configuration2.builder.fluent.Parameters;
import org.nutz.json.Json;

/**
 * @author zongtao liu</br>
 *         2017年4月20日 下午4:37:29</br>
 */
public class XmlFileFactory {
    

    /***
     * 将文件加载为文件对应的对象
     * 
     * @param filePath
     * @param clazz
     * @return
     */
    public static <T> T loadFile(String filePath, Class<T> clazz) {
        T obj = null;
        Parameters params = new Parameters();
        FileBasedConfigurationBuilder<XMLConfiguration> builder = new FileBasedConfigurationBuilder<XMLConfiguration>(
                XMLConfiguration.class).configure(params.xml().setFileName(filePath));

        try {
            XMLConfiguration config = builder.getConfiguration();
            obj = loadObj(config, "", clazz);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return obj;
    }

    /****
     * 加载对象
     * 
     * @param config
     * @param preProperty
     * @param clazz
     * @return
     * @throws InstantiationException
     * @throws IllegalAccessException
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    private static <T> T loadObj(XMLConfiguration config, String preProperty, Class<T> clazz)
            throws InstantiationException, IllegalAccessException {
        T obj = clazz.newInstance();
        Field[] fields = clazz.getDeclaredFields();
        int num = 0;
        for (Field field : fields) {
            field.setAccessible(true); // 设置些属性是可以访问的
            String name = field.getName();
            String key = preProperty + name;
            Class<?> cls = field.getType();
            // 如果是枚举类型,直接跳过
            if (cls.isEnum()) {
                continue;
            }
            Object configValue = null;
            if (isBaseDataType(cls)) {
   // 如果是基础数据类型
                configValue = config.get(cls, key);
            } else if (cls.isArray()) {
   // 是否是数组
                Class<?> componentType = cls.getComponentType();
                if (isBaseDataType(componentType)) {
                    configValue = config.getArray(componentType, key);
                } else 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
commons-configuration2 是一个用于读取配置属性的 Java 库。热读是指在应用程序运行期间,在不重启应用的情况下随时动态地读取和更新配置属性的能力。 使用 commons-configuration2 实现热读配置属性的过程如下: 首先,需要创建一个配置对象来加载和保存配置属性。可以使用 PropertiesConfiguration、XMLConfiguration 或者 IniConfiguration 等各种配置文件格式进行配置。 然后,在应用程序中使用配置对象读取需要的配置属性。可以通过调用 getProperty(key) 方法,传入指定的配置项名称来获取对应的值。例如,String value = config.getString("database.url")。 接下来,为了实现热读的功能,需要定时加载更新配置文件。可以使用 ScheduledExecutorService 来实现定时任务,定时调用配置对象的 reload() 方法,更新配置属性。例如,每隔一定时间重新加载一次配置属性:scheduleAtFixedRate(() -> config.reload(), 0, 1, TimeUnit.MINUTES)。 当配置文件更新后,调用 reload() 方法重新加载配置属性,并且可以通过 getProperty(key) 方法获取最新的配置值。这样就实现了在应用程序运行期间实时读取配置属性的功能。 总结起来,使用 commons-configuration2 库可以方便地实现热读配置属性的功能。通过定时加载更新配置文件,并使用配置对象的 reload() 方法实现配置属性的更新,就可以在应用程序运行期间实现动态读取配置属性的能力。这种灵活性可以避免重启应用程序来更新配置属性,提高了系统的可扩展性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值