如何自检freemarker模板以找出其使用的变量?

我根本不确定这是否是可以解决的问题,但是假设我有一个freemarker模板,我想问一下该模板使用了哪些变量。

就我的目的而言,我们可以假设freemarker模板非常简单-

只是“根级别”条目(此类模板的模型可以是简单的Map)。换句话说,我不需要处理要求嵌套结构等的模板。

回答:

我有相同的任务要从Java端的模板获取变量列表,除了使用反射之外,没有找到任何好的方法。我不确定是否有更好的方法来获取此数据,但这是我的方法:

public Set<String> referenceSet(Template template) throws TemplateModelException {

Set<String> result = new HashSet<>();

TemplateElement rootTreeNode = template.getRootTreeNode();

for (int i = 0; i < rootTreeNode.getChildCount(); i++) {

TemplateModel templateModel = rootTreeNode.getChildNodes().get(i);

if (!(templateModel instanceof StringModel)) {

continue;

}

Object wrappedObject = ((StringModel) templateModel).getWrappedObject();

if (!"DollarVariable".equals(wrappedObject.getClass().getSimpleName())) {

continue;

}

try {

Object expression = getInternalState(wrappedObject, "expression");

switch (expression.getClass().getSimpleName()) {

case "Identifier":

result.add(getInternalState(expression, "name").toString());

break;

case "DefaultToExpression":

result.add(getInternalState(expression, "lho").toString());

break;

case "BuiltinVariable":

break;

default:

throw new IllegalStateException("Unable to introspect variable");

}

} catch (NoSuchFieldException | IllegalAccessException e) {

throw new TemplateModelException("Unable to reflect template model");

}

}

return result;

}

private Object getInternalState(Object o, String fieldName) throws NoSuchFieldException, IllegalAccessException {

Field field = o.getClass().getDeclaredField(fieldName);

boolean wasAccessible = field.isAccessible();

try {

field.setAccessible(true);

return field.get(o);

} finally {

field.setAccessible(wasAccessible);

}

}

我为演示模板自省所做的示例项目可以在github上找到:https

:

//github.com/SimY4/TemplatesPOC.git

以上是 如何自检freemarker模板以找出其使用的变量? 的全部内容, 来源链接: utcz.com/qa/409310.html

回到顶部