public interface MethodAppearanceFineTuner
BeansWrapper.setMethodAppearanceFineTuner(MethodAppearanceFineTuner). The object that implements this should also implement
void process(BeansWrapper.MethodAppearanceDecisionInput in, BeansWrapper.MethodAppearanceDecision out)
BeansWrapperwill pass in all Java methods here that it intends to expose in the data-model as methods (so you can do obj.foo() in the template). With this method you can do the following tweaks:
BeansWrapper.MethodAppearanceDecision.setExposeMethodAs(String)with null parameter. Note that you can't un-hide methods that are not public or are considered to by unsafe (like
process(freemarker.ext.beans.BeansWrapper.MethodAppearanceDecisionInput, freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision)is not called for those.
BeansWrapper.MethodAppearanceDecision.setExposeMethodAs(String)with non-null parameter.
BeansWrapper.MethodAppearanceDecision.setExposeAsProperty(PropertyDescriptor). For example, if you have int size() in a class, but you want it to be accessed from the templates as obj.size, rather than as obj.size(), you can do that with this (but remember calling
setMethodShadowsProperty(false)as well, if the method name is exactly the same as the property name). The default is
null, which means that no fake property is created for the method. You need not and shouldn't set this to non-null for the getter methods of real JavaBean properties, as those are automatically shown as properties anyway. The property name in the
PropertyDescriptorcan be anything, but the method (or methods) in it must belong to the class that is given as the clazz parameter or it must be inherited from that class, or else whatever errors can occur later.
IndexedPropertyDescriptor-s are supported. If a real JavaBean property of the same name exists, or a fake property of the same name was already assigned earlier, it won't be replaced by the new one by default, however this can be changed with
BeansWrapper.MethodAppearanceDecision.setMethodShadowsProperty(boolean)with false. The default is true, so if you have both a property and a method called "foo", then in the template myObject.foo will return the method itself instead of the property value, which is often undesirable.
Note that you can expose a Java method both as a method and as a JavaBean property on the same time, however you have to chose different names for them to prevent shadowing.
in- Describes the method about which the decision will have to be made.
out- Stores how the method will be exposed in the data-model after
process(freemarker.ext.beans.BeansWrapper.MethodAppearanceDecisionInput, freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision)returns. This is initialized so that it reflects the default behavior of
BeansWrapper, so you don't have to do anything with this when you don't want to change the default behavior.