Class ReflectivePropertyAccessor

java.lang.Object
org.springframework.expression.spel.support.ReflectivePropertyAccessor
All Implemented Interfaces:
PropertyAccessor
Direct Known Subclasses:
DataBindingPropertyAccessor

public class ReflectivePropertyAccessor extends Object implements PropertyAccessor
A powerful PropertyAccessor that uses reflection to access properties for reading and possibly also for writing on a target instance.

A property can be referenced through a public getter method (when being read) or a public setter method (when being written), and also as a public field.

Since:
3.0
Author:
Andy Clement, Juergen Hoeller, Phillip Webb, Sam Brannen, Sebastien Deleuze
See Also:
  • Constructor Details

  • Method Details

    • getSpecificTargetClasses

      @Nullable public Class<?>[] getSpecificTargetClasses()
      Returns null which means this is a general purpose accessor.
      Specified by:
      getSpecificTargetClasses in interface PropertyAccessor
      Returns:
      an array of classes that this resolver is suitable for (or null if a general resolver)
    • canRead

      public boolean canRead(EvaluationContext context, @Nullable Object target, String name) throws AccessException
      Description copied from interface: PropertyAccessor
      Called to determine if a resolver instance is able to access a specified property on a specified target object.
      Specified by:
      canRead in interface PropertyAccessor
      Parameters:
      context - the evaluation context in which the access is being attempted
      target - the target object upon which the property is being accessed
      name - the name of the property being accessed
      Returns:
      true if this resolver is able to read the property
      Throws:
      AccessException - if there is any problem determining whether the property can be read
    • read

      public TypedValue read(EvaluationContext context, @Nullable Object target, String name) throws AccessException
      Description copied from interface: PropertyAccessor
      Called to read a property from a specified target object. Should only succeed if PropertyAccessor.canRead(org.springframework.expression.EvaluationContext, java.lang.Object, java.lang.String) also returns true.
      Specified by:
      read in interface PropertyAccessor
      Parameters:
      context - the evaluation context in which the access is being attempted
      target - the target object upon which the property is being accessed
      name - the name of the property being accessed
      Returns:
      a TypedValue object wrapping the property value read and a type descriptor for it
      Throws:
      AccessException - if there is any problem accessing the property value
    • canWrite

      public boolean canWrite(EvaluationContext context, @Nullable Object target, String name) throws AccessException
      Description copied from interface: PropertyAccessor
      Called to determine if a resolver instance is able to write to a specified property on a specified target object.
      Specified by:
      canWrite in interface PropertyAccessor
      Parameters:
      context - the evaluation context in which the access is being attempted
      target - the target object upon which the property is being accessed
      name - the name of the property being accessed
      Returns:
      true if this resolver is able to write to the property
      Throws:
      AccessException - if there is any problem determining whether the property can be written to
    • write

      public void write(EvaluationContext context, @Nullable Object target, String name, @Nullable Object newValue) throws AccessException
      Description copied from interface: PropertyAccessor
      Called to write to a property on a specified target object. Should only succeed if PropertyAccessor.canWrite(org.springframework.expression.EvaluationContext, java.lang.Object, java.lang.String) also returns true.
      Specified by:
      write in interface PropertyAccessor
      Parameters:
      context - the evaluation context in which the access is being attempted
      target - the target object upon which the property is being accessed
      name - the name of the property being accessed
      newValue - the new value for the property
      Throws:
      AccessException - if there is any problem writing to the property value
    • findGetterForProperty

      @Nullable protected Method findGetterForProperty(String propertyName, Class<?> clazz, boolean mustBeStatic)
      Find a getter method for the specified property.
    • findSetterForProperty

      @Nullable protected Method findSetterForProperty(String propertyName, Class<?> clazz, boolean mustBeStatic)
      Find a setter method for the specified property.
    • isCandidateForProperty

      protected boolean isCandidateForProperty(Method method, Class<?> targetClass)
      Determine whether the given Method is a candidate for property access on an instance of the given target class.

      The default implementation considers any method as a candidate, even for non-user-declared properties on the Object base class.

      Parameters:
      method - the Method to evaluate
      targetClass - the concrete target class that is being introspected
      Since:
      4.3.15
    • getPropertyMethodSuffixes

      protected String[] getPropertyMethodSuffixes(String propertyName)
      Return the method suffixes for a given property name. The default implementation uses JavaBean conventions with additional support for properties of the form 'xY' where the method 'getXY()' is used in preference to the JavaBean convention of 'getxY()'.
    • getPropertyMethodSuffix

      protected String getPropertyMethodSuffix(String propertyName)
      Return the method suffix for a given property name. The default implementation uses JavaBean conventions.
    • findField

      @Nullable protected Field findField(String name, Class<?> clazz, boolean mustBeStatic)
      Find a field of a certain name on a specified class.
    • createOptimalAccessor

      public PropertyAccessor createOptimalAccessor(EvaluationContext context, @Nullable Object target, String name)
      Attempt to create an optimized property accessor tailored for a property of a particular name on a particular class. The general ReflectivePropertyAccessor will always work but is not optimal due to the need to lookup which reflective member (method/field) to use each time read() is called. This method will just return the ReflectivePropertyAccessor instance if it is unable to build a more optimal accessor.

      Note: An optimal accessor is currently only usable for read attempts. Do not call this method if you need a read-write accessor.

      See Also: