Class ReflectionValueExtractor


  • public class ReflectionValueExtractor
    extends java.lang.Object

    Using simple dotted expressions to extract the values from an Object instance, For example we might want to extract a value like: project.build.sourceDirectory

    The implementation supports indexed, nested and mapped properties similar to the JSP way.

    Version:
    $Id$
    See Also:
    http://struts.apache.org/1.x/struts-taglib/indexedprops.html
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private static java.lang.Class<?>[] CLASS_ARGS  
      private static java.util.Map<java.lang.Class<?>,​ClassMap> CLASS_MAPS
      Use a WeakHashMap here, so the keys (Class objects) can be garbage collected.
      (package private) static int EOF  
      (package private) static char INDEXED_END  
      (package private) static char INDEXED_START  
      (package private) static char MAPPED_END  
      (package private) static char MAPPED_START  
      private static java.lang.Object[] OBJECT_ARGS  
      (package private) static char PROPERTY_START  
    • Method Summary

      All Methods Static Methods Concrete Methods 
      Modifier and Type Method Description
      static java.lang.Object evaluate​(java.lang.String expression, java.lang.Object root)
      The implementation supports indexed, nested and mapped properties.
      static java.lang.Object evaluate​(java.lang.String expression, java.lang.Object root, boolean trimRootToken)
      The implementation supports indexed, nested and mapped properties.
      private static ClassMap getClassMap​(java.lang.Class<?> clazz)  
      private static java.lang.Object getIndexedValue​(java.lang.String expression, int from, int to, java.lang.Object value, java.lang.String indexStr)  
      private static java.lang.Object getMappedValue​(java.lang.String expression, int from, int to, java.lang.Object value, java.lang.String key)  
      private static java.lang.Object getPropertyValue​(java.lang.Object value, java.lang.String property)  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • CLASS_ARGS

        private static final java.lang.Class<?>[] CLASS_ARGS
      • OBJECT_ARGS

        private static final java.lang.Object[] OBJECT_ARGS
      • CLASS_MAPS

        private static final java.util.Map<java.lang.Class<?>,​ClassMap> CLASS_MAPS
        Use a WeakHashMap here, so the keys (Class objects) can be garbage collected. This approach prevents permgen space overflows due to retention of discarded classloaders.
    • Constructor Detail

      • ReflectionValueExtractor

        private ReflectionValueExtractor()
    • Method Detail

      • evaluate

        public static java.lang.Object evaluate​(@Nonnull
                                                java.lang.String expression,
                                                @Nullable
                                                java.lang.Object root)
                                         throws IntrospectionException

        The implementation supports indexed, nested and mapped properties.

        • nested properties should be defined by a dot, i.e. "user.address.street"
        • indexed properties (java.util.List or array instance) should be contains (\\w+)\\[(\\d+)\\] pattern, i.e. "user.addresses[1].street"
        • mapped properties should be contains (\\w+)\\((.+)\\) pattern, i.e. "user.addresses(myAddress).street"
          Parameters:
          expression - not null expression
          root - not null object
          Returns:
          the object defined by the expression
          Throws:
          IntrospectionException - if any
        • evaluate

          public static java.lang.Object evaluate​(@Nonnull
                                                  java.lang.String expression,
                                                  @Nullable
                                                  java.lang.Object root,
                                                  boolean trimRootToken)
                                           throws IntrospectionException

          The implementation supports indexed, nested and mapped properties.

          • nested properties should be defined by a dot, i.e. "user.address.street"
          • indexed properties (java.util.List or array instance) should be contains (\\w+)\\[(\\d+)\\] pattern, i.e. "user.addresses[1].street"
          • mapped properties should be contains (\\w+)\\((.+)\\) pattern, i.e. "user.addresses(myAddress).street"
            Parameters:
            expression - not null expression
            root - not null object
            trimRootToken - trim root token yes/no.
            Returns:
            the object defined by the expression
            Throws:
            IntrospectionException - if any
          • getMappedValue

            private static java.lang.Object getMappedValue​(java.lang.String expression,
                                                           int from,
                                                           int to,
                                                           java.lang.Object value,
                                                           java.lang.String key)
                                                    throws IntrospectionException
            Throws:
            IntrospectionException
          • getIndexedValue

            private static java.lang.Object getIndexedValue​(java.lang.String expression,
                                                            int from,
                                                            int to,
                                                            java.lang.Object value,
                                                            java.lang.String indexStr)
                                                     throws IntrospectionException
            Throws:
            IntrospectionException
          • getClassMap

            private static ClassMap getClassMap​(java.lang.Class<?> clazz)