Package freemarker.ext.beans
Interface MethodAppearanceFineTuner
public interface MethodAppearanceFineTuner
Used for customizing how the methods are visible from templates, via
BeansWrapper.setMethodAppearanceFineTuner(MethodAppearanceFineTuner)
.
The object that implements this should also implement SingletonCustomizer
whenever possible.- Since:
- 2.3.21
-
Method Summary
Modifier and TypeMethodDescriptionvoid
Implement this to tweak certain aspects of how methods appear in the data-model.
-
Method Details
-
process
void process(BeansWrapper.MethodAppearanceDecisionInput in, BeansWrapper.MethodAppearanceDecision out) Implement this to tweak certain aspects of how methods appear in the data-model.BeansWrapper
will 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:- Hide a method that would be otherwise shown by calling
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 (likeObject.wait()
) becauseprocess(freemarker.ext.beans.BeansWrapper.MethodAppearanceDecisionInput, freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision)
is not called for those. - Show the method with a different name in the data-model than its
real name by calling
BeansWrapper.MethodAppearanceDecision.setExposeMethodAs(String)
with non-null parameter. - Create a fake JavaBean property for this method by calling
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 callingsetMethodShadowsProperty(false)
as well, if the method name is exactly the same as the property name). The default isnull
, 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 thePropertyDescriptor
can 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 withBeansWrapper.MethodAppearanceDecision.setReplaceExistingProperty(boolean)
. - Prevent the method to hide a JavaBean property (fake or real) of
the same name by calling
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.
- Parameters:
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 afterprocess(freemarker.ext.beans.BeansWrapper.MethodAppearanceDecisionInput, freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision)
returns. This is initialized so that it reflects the default behavior ofBeansWrapper
, so you don't have to do anything with this when you don't want to change the default behavior.
- Hide a method that would be otherwise shown by calling
-