如何将Apache JEXL语法中的{}改为Map而非Set、[]改为ArrayList
修改JEXL字面量默认类型:{}为Map、[]为ArrayList
核心逻辑
JEXL的字面量解析行为可通过引擎配置或自定义扩展调整。针对你的需求:
- 让
[]默认生成ArrayList而非原生数组; - 让
{}默认对应Map(原生JEXL中{key:value}本来就是Map,若要禁用{元素列表}这种Set语法,可额外配置)。
JEXL 3.x 实现(推荐,主流版本)
1. 基础配置
通过JexlFeatures调整解析规则,再构建自定义JexlEngine:
import org.apache.commons.jexl3.*; public class CustomJexlSetup { public static void main(String[] args) { // 配置解析特征 JexlFeatures features = new JexlFeatures() // 开启[]字面量解析为List(默认实现是ArrayList) .setArrayLiteralAsList(true) // 可选:禁用Set字面量语法,强制{}仅作为Map使用 .setSetLiteral(false); // 构建自定义引擎 JexlEngine jexl = new JexlBuilder() .features(features) .create(); // 测试验证 // []生成ArrayList JexlExpression listExpr = jexl.createExpression("[1, 2, 3]"); System.out.println("[]的实际类型: " + listExpr.evaluate(null).getClass()); // {}生成Map JexlExpression mapExpr = jexl.createExpression("{name: 'Alice', age: 25}"); System.out.println("{}的实际类型: " + mapExpr.evaluate(null).getClass()); } }
2. 自定义Map实现(可选)
如果需要指定Map的具体实现(比如LinkedHashMap),可以自定义JexlUberspect:
import org.apache.commons.jexl3.*; import java.util.LinkedHashMap; import java.util.Map; class CustomMapUberspect extends JexlUberspect { @Override public Map<String, Object> createMap() { // 返回你需要的Map实现类 return new LinkedHashMap<>(); } } // 构建引擎时替换Uberspect JexlEngine jexl = new JexlBuilder() .features(features) .uberspect(new CustomMapUberspect()) .create();
JEXL 2.x 实现(兼容旧版本)
JEXL 2.x没有JexlFeatures,需要直接重写引擎的集合创建逻辑:
import org.apache.commons.jexl2.*; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class Jexl2CustomSetup { public static void main(String[] args) { JexlEngine jexl = new JexlEngine() { // 把[]生成的数组转为ArrayList @Override protected Object createArray(Object[] array) { ArrayList<Object> list = new ArrayList<>(); for (Object item : array) { list.add(item); } return list; } // 自定义Map实现 @Override protected Map<String, Object> createMap() { return new HashMap<>(); } // 禁用Set字面量(可选) @Override protected java.util.Set<Object> createSet() { throw new JexlException("Set字面量已禁用,请使用Map语法"); } }; // 测试 Expression listExpr = jexl.createExpression("[1,2,3]"); System.out.println("[]的实际类型: " + listExpr.evaluate(null).getClass()); Expression mapExpr = jexl.createExpression("{name: 'Bob'}"); System.out.println("{}的实际类型: " + mapExpr.evaluate(null).getClass()); } }
内容的提问来源于stack exchange,提问作者ishua
相关产品推荐
相关产品推荐

