如何使用以下语法访问方法/字段:
${object.foo}
?
我想要的是:
如果有一个公共字段,名为foo,那么它的值返回,
否则,如果有一个getter,名为getFoo(),那么它调用并返回调用结果,
否则,如果有一个名为foo()的方法,则调用并返回调用结果
在Freemarker中有可能吗?
答案 0 :(得分:0)
由于您可以编写自己的ObjectWrapper
实现,但是如果您需要超过object.foo
工作(例如,公开方法等),编写对象包装器可以是批次的工作。因此,使用DefaultObjectWrapper
或BeansWrapper
可能是一个很好的折衷方案。配置FreeMarker的地方:
BeansWrapper bw = new DefaultObjectWrapper() {
@Override
protected void finetuneMethodAppearance(
Class clazz, Method m, MethodAppearanceDecision decision) {
if (m.getDeclaringClass() != Object.class
&& m.getReturnType() != void.class
&& m.getParameterTypes().length == 0) {
String mName = m.getName();
if (!(mName.startsWith("get")
&& (mName.length() == 3
|| Character.isUpperCase(mName.charAt(3))))) {
decision.setExposeMethodAs(null);
try {
decision.setExposeAsProperty(new PropertyDescriptor(
mName, clazz, mName, null));
} catch (IntrospectionException e) { // Won't happen...
throw new RuntimeException(e);
}
}
}
}
};
bw.setExposeFields(true);
cfg.setObjectWrapper(bw);
优先事项并不完全符合您的要求。 object.foo
将按此顺序尝试:getFoo()
,foo()
,foo