gpt4 book ai didi

java - Freemarker:以编程方式读取一些模板参数

转载 作者:行者123 更新时间:2023-12-01 10:36:04 25 4
gpt4 key购买 nike

我正在尝试以编程方式从 Java 读取一些 freemarker 模板值,如下所示:

public Map<String, Object> getRootAssignments() {
Enumeration en = template.getRootTreeNode().children();

Map<String, Object> map = new HashMap<>();
while (en.hasMoreElements()) {
Object next = en.nextElement();

// instanceof private class does not work
if (next.getClass().getSimpleName().equals("Assignment")) {
map.put(getInternalState(next, "variableName").toString(),
getInternalState(next, "value").toString());
}
}
return map;
}



private Object getInternalState(Object o, String fieldName) {
Field field = null;
boolean wasAccessible = false;
try {
field = o.getClass().getDeclaredField(fieldName);
wasAccessible = field.isAccessible();
field.setAccessible(true);
return field.get(o);
} catch (Exception e) {
return "";
} finally {
if (field != null) {
field.setAccessible(wasAccessible);
}
}
}

有了这个我可以轻松阅读<#assign variable = "value"/> 。但是一旦我需要获取一些需要评估的变量(例如 <#assign variable = "first" + "second"/> ),这显然不起作用。

事实上,我不太喜欢这种方法,我更喜欢在模板渲染之后读取变量状态,因此不需要再次评估任何内容。可行吗?

最佳答案

如果保持 freemarker.core.Environment 处于 Activity 状态,则可以读回变量值,如下所示:

Environment env = myTemplate.createProcessingEnvironment(root, out);
env.process(); // process the template
TemplateModel x = env.getVariable("x");

在您最初的方法中,请注意您使用的 API 被标记为内部,这意味着没有长期向后兼容性保证。但真正脆弱的是通过反射(reflection)来阅读私有(private)领域。然后调用 TemplateObject.getParameterCount/getParameterRole/getParameterValue 会更稳定,因为这至少是一个 API,即使是内部的。

关于java - Freemarker:以编程方式读取一些模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34717734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com