大家在进行java开发的时候,习惯将一些配置放在properties文件中。但有些时候又想在应用启动后修改配置变量,除了使用数据库、缓存保存配置外,还可以通过jmx,将需要进行动态配置的对象曝露出来,方便运维修改。现在有一个很让我困惑的问题,我把一些配置封装为一个pojo类,容器启动时配置从properties初始化参数。获取配置时使用反射调用get方法获取,更新配置时则使用set方法更新之,也能实现动态更改配置的目的。是不是说如果只是想实现动态修改配置的目的,完全只需要用这种方法即可,无须使用jmx这么复杂的技术,我的那种做法有没有风险或者缺漏之处?希望各位能够指点一二。
代码如下:
POJO类:DynamicConstants public class DynamicConstants { private String staticPath; public String getStaticPath() {
return staticPath;
} public void setStaticPath(String staticPath) {
this.staticPath = staticPath;
}
}
jmxjava反射

解决方案 »

  1.   

    通过反射动态修改的类public class JmxConfigServiceImpl implements JmxConfigService { private static final Logger LOGGER = LoggerFactory
    .getLogger(JmxConfigServiceImpl.class); @Autowired
    DynamicConstants constants; public Map<String, Object> reflectAllFields() {
    Map<String, Object> map = new HashMap<String, Object>();
    @SuppressWarnings("rawtypes")
    Class clazz = constants.getClass();
    Field[] fields = clazz.getDeclaredFields();
    PropertyDescriptor pd = null;
    Method method = null;
    try {
    for (Field field : fields) {
    pd = new PropertyDescriptor(field.getName(), clazz);
    method = pd.getReadMethod(); // 获取get方法
    map.put(field.getName(),
    String.valueOf(method.invoke(constants)));
    }
    } catch (Exception e) {
    LOGGER.info("", e);
    }
    LOGGER.info("反射获取到的常量配置类的配置为:" + new Gson().toJson(map));
    return map;
    } public boolean setConstantsByKey(Map<String, String[]> parameterMap) {
    @SuppressWarnings("rawtypes")
    Class clazz = constants.getClass();
    Field[] fields = clazz.getDeclaredFields();
    PropertyDescriptor pd = null;
    Method method = null;
    try {
    Set<String> keySet = parameterMap.keySet();
    for (String key : keySet) {
    for (Field field : fields) {
    if (key.equals(field.getName())) {
    pd = new PropertyDescriptor(field.getName(), clazz);
    method = pd.getWriteMethod(); // 获取set方法
    method.invoke(constants, parameterMap.get(key)[0]);
    break;
    }
    }
    }
    LOGGER.info("修改成功");
    } catch (Exception e) {
    LOGGER.info("", e);
    return false;
    }
    return true;
    }}