次の構文を使用して、メソッド/フィールドにアクセスするにはどうすればよい
${object.foo}
ですか?
私が欲しいのは:
fooという名前のパブリックフィールドがある場合、その値が返されます。
そうでない場合、getFoo()という名前のゲッターがある場合、それが呼び出され、呼び出しの結果が返されます。
そうでない場合、fooという名前のメソッドがある場合() を呼び出すと、呼び出しの結果が返されます。
Freemarkerでそれは可能ですか?
2329 次
1 に答える
0
独自の実装を作成できるので可能ですが、(メソッドの公開など) 作業ObjectWrapper
以上のことが必要な場合は、オブジェクト ラッパーを作成するのは大変な作業になる可能性があります。したがって、おそらく適切な妥協点はorを使用することです。FreeMarker を構成する場所:object.foo
DefaultObjectWrapper
BeansWrapper
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 に答える