如何使用以下语法访问方法/字段:
${object.foo}
?
我想要的是:
如果有一个名为 foo 的公共字段,那么它的值返回,
否则如果有一个 getter,名为 getFoo(),那么它调用并返回调用结果,
否则如果有一个名为 foo 的方法(),然后调用并返回调用结果。
在 Freemarker 中可以吗?
问问题
2329 次
1 回答
0
由于您可以编写自己的ObjectWrapper
实现,因此这是可能的,尽管如果您需要的不仅仅是object.foo
工作(例如,公开方法等),编写对象包装器可能需要做很多工作。所以,也许一个很好的折衷方案是使用DefaultObjectWrapper
or 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
于 2013-09-21T10:15:13.783 回答