有时候,Properties中总有一些Key-Value ,其中Value往往会有重复部分。
比如,我在写一个代码生成工具,
需要定义如下的属性
modelPackage = com.corp.project.model
controllerPackage = com.corp.project.controller
其中,com.corp.project是重复的。
就想着能不能象 编程一样,前面声明一个变量,后面可以用${variale}形式引用
如下面这样定义
basePackage = com.corp.project
modelPackage = ${basePackage}.model
controllerPackage = ${basePackage}.controller
本来想用 遍历Properties的entry方式。但是发现,Properties内部用hashmap存储数据,顺序与原始的不一致,不能直接处理。
看了一下Properties的load方法实现,是每读一个 key-value,调用一次 put方法。
得到结论,直接重载这个方法。在插入前,处理出所需的value。
public class EvaluateProperties extends Properties {
private Map<String, Object> context = new HashMap<String, Object>();
@Override
public synchronized Object put(Object key, Object value) {
if (key == null) {
throw new IllegalArgumentException("Key should not be null");
}
Object resultValue;
if (value != null) {
String valueText = value == null?"":value.toString();
resultValue = TemplateRuntime.eval(valueText, this.context);
} else {
resultValue = "";
}
this.context.put(key.toString(), resultValue);
return super.put(key, resultValue);
}
}
表达式解析用了MVEL2的TemplateRuntime.
<dependency>
<groupId>org.mvel</groupId>
<artifactId>mvel2</artifactId>
<version>2.0.19</version>
</dependency>
表达式处理还有很多其他选择,antlr