1

如何使用以下语法访问方法/字段: ${object.foo}
我想要的是:
如果有一个名为 foo 的公共字段,那么它的值返回,
否则如果有一个 getter,名为 getFoo(),那么它调用并返回调用结果,
否则如果有一个名为 foo 的方法(),然后调用并返回调用结果。
在 Freemarker 中可以吗?

4

1 回答 1

0

由于您可以编写自己的ObjectWrapper实现,因此这是可能的,尽管如果您需要的不仅仅是object.foo工作(例如,公开方法等),编写对象包装器可能需要做很多工作。所以,也许一个很好的折衷方案是使用DefaultObjectWrapperor 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 回答