1

次の構文を使用して、メソッド/フィールドにアクセスするにはどうすればよい ${object.foo} ですか?
私が欲しいのは:
fooという名前のパブリックフィールドがある場合、その値が返されます。
そうでない場合、getFoo()という名前のゲッターがある場合、それが呼び出され、呼び出しの結果が返されます。
そうでない場合、fooという名前のメソッドがある場合() を呼び出すと、呼び出しの結果が返されます。
Freemarkerでそれは可能ですか?

4

1 に答える 1

0

独自の実装を作成できるので可能ですが、(メソッドの公開など) 作業ObjectWrapper以上のことが必要な場合は、オブジェクト ラッパーを作成するのは大変な作業になる可能性があります。したがって、おそらく適切な妥協点はorを使用することです。FreeMarker を構成する場所:object.fooDefaultObjectWrapperBeansWrapper

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 に答える