public interface MethodAppearanceFineTuner
BeansWrapper.setMethodAppearanceFineTuner(MethodAppearanceFineTuner)
.
The object that implements this should also implement SingletonCustomizer
whenever possible.Modifier and Type | Method and Description |
---|---|
void |
process(BeansWrapper.MethodAppearanceDecisionInput in,
BeansWrapper.MethodAppearanceDecision out)
Implement this to tweak certain aspects of how methods appear in the
data-model.
|
void process(BeansWrapper.MethodAppearanceDecisionInput in, BeansWrapper.MethodAppearanceDecision out)
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:
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 Object.wait()
) because
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 PropertyDescriptor
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 with
BeansWrapper.MethodAppearanceDecision.setReplaceExistingProperty(boolean)
.
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.