Class SpelNodeImpl

java.lang.Object
org.springframework.expression.spel.ast.SpelNodeImpl
All Implemented Interfaces:
org.springframework.asm.Opcodes, SpelNode
Direct Known Subclasses:
Assign, BeanReference, CompoundExpression, ConstructorReference, Elvis, FunctionReference, Identifier, Indexer, InlineList, InlineMap, Literal, MethodReference, Operator, OperatorNot, Projection, PropertyOrFieldReference, QualifiedIdentifier, Selection, Ternary, TypeReference, VariableReference

public abstract class SpelNodeImpl extends Object implements SpelNode, org.springframework.asm.Opcodes
The common supertype of all AST nodes in a parsed Spring Expression Language format expression.
Since:
3.0
Author:
Andy Clement, Juergen Hoeller, Sam Brannen
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected SpelNodeImpl[]
     
    protected @Nullable String
    Indicates the type descriptor for the result of this expression node.

    Fields inherited from interface org.springframework.asm.Opcodes

    AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_RECORD, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM10_EXPERIMENTAL, ASM4, ASM5, ASM6, ASM7, ASM8, ASM9, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V_PREVIEW, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V9
  • Constructor Summary

    Constructors
    Constructor
    Description
    SpelNodeImpl(int startPos, int endPos, SpelNodeImpl @Nullable ... operands)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    protected static void
    generateCodeForArgument(org.springframework.asm.MethodVisitor mv, CodeFlow cf, SpelNodeImpl argument, String paramDesc)
    protected static void
    generateCodeForArguments(org.springframework.asm.MethodVisitor mv, CodeFlow cf, Executable executable, SpelNodeImpl[] arguments)
    Generate code that handles building the argument values for the specified Executable (method or constructor).
    protected static void
    generateCodeForArguments(org.springframework.asm.MethodVisitor mv, CodeFlow cf, Member member, SpelNodeImpl[] arguments)
    getChild(int index)
    Return the nth child under this node.
    int
    Return the number of children under this node.
    int
    Return the end position of this AST node in the expression string.
     
    Determine the class of the object passed in, unless it is already a class object.
    int
    Return the start position of this AST node in the expression string.
    getTypedValue(ExpressionState expressionState)
    Evaluate the expression node in the context of the supplied expression state and return the typed value.
    getValue(ExpressionState expressionState)
    Evaluate the expression node in the context of the supplied expression state and return the value.
    protected final <T> @Nullable T
    getValue(ExpressionState state, Class<T> desiredReturnType)
     
    abstract TypedValue
     
    protected ValueRef
     
    boolean
    Determine if this node is the target of a null-safe navigation operation.
    boolean
    isWritable(ExpressionState expressionState)
    Determine if this expression node will support a setValue() call.
    protected boolean
    nextChildIs(Class<?>... classes)
    Return true if the next child is one of the specified classes.
    void
    setValue(ExpressionState expressionState, @Nullable Object newValue)
    Evaluate the expression to a node and then set the new value on that node.
    setValueInternal(ExpressionState expressionState, Supplier<TypedValue> valueSupplier)
    Evaluate the expression to a node and then set the new value created by the specified Supplier on that node.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

    Methods inherited from interface org.springframework.expression.spel.SpelNode

    generateCode, isCompilable, toStringAST
  • Field Details

    • children

      protected SpelNodeImpl[] children
    • exitTypeDescriptor

      protected volatile @Nullable String exitTypeDescriptor
      Indicates the type descriptor for the result of this expression node. This is set as soon as it is known. For a literal node it is known immediately. For a property access or method invocation it is known after one evaluation of that node.

      The descriptor is like the bytecode form but is slightly easier to work with. It does not include the trailing semicolon (for non array reference types). Some examples: Ljava/lang/String, I, [I

  • Constructor Details

  • Method Details

    • nextChildIs

      protected boolean nextChildIs(Class<?>... classes)
      Return true if the next child is one of the specified classes.
    • getValue

      public final @Nullable Object getValue(ExpressionState expressionState) throws EvaluationException
      Description copied from interface: SpelNode
      Evaluate the expression node in the context of the supplied expression state and return the value.
      Specified by:
      getValue in interface SpelNode
      Parameters:
      expressionState - the current expression state (includes the context)
      Returns:
      the value of this node evaluated against the specified state
      Throws:
      EvaluationException - if any problem occurs evaluating the expression
    • getTypedValue

      public final TypedValue getTypedValue(ExpressionState expressionState) throws EvaluationException
      Description copied from interface: SpelNode
      Evaluate the expression node in the context of the supplied expression state and return the typed value.
      Specified by:
      getTypedValue in interface SpelNode
      Parameters:
      expressionState - the current expression state (includes the context)
      Returns:
      the typed value of this node evaluated against the specified state
      Throws:
      EvaluationException - if any problem occurs evaluating the expression
    • isWritable

      public boolean isWritable(ExpressionState expressionState) throws EvaluationException
      Description copied from interface: SpelNode
      Determine if this expression node will support a setValue() call.
      Specified by:
      isWritable in interface SpelNode
      Parameters:
      expressionState - the current expression state (includes the context)
      Returns:
      true if the expression node will allow setValue()
      Throws:
      EvaluationException - if something went wrong trying to determine if the node supports writing
    • setValue

      public void setValue(ExpressionState expressionState, @Nullable Object newValue) throws EvaluationException
      Description copied from interface: SpelNode
      Evaluate the expression to a node and then set the new value on that node. For example, if the expression evaluates to a property reference, then the property will be set to the new value.
      Specified by:
      setValue in interface SpelNode
      Parameters:
      expressionState - the current expression state (includes the context)
      newValue - the new value
      Throws:
      EvaluationException - if any problem occurs evaluating the expression or setting the new value
    • setValueInternal

      public TypedValue setValueInternal(ExpressionState expressionState, Supplier<TypedValue> valueSupplier) throws EvaluationException
      Evaluate the expression to a node and then set the new value created by the specified Supplier on that node.

      For example, if the expression evaluates to a property reference, then the property will be set to the new value.

      Favor this method over setValue(ExpressionState, Object) when the value should be lazily computed.

      By default, this method throws a SpelEvaluationException, effectively disabling this feature. Subclasses may override this method to provide an actual implementation.

      Parameters:
      expressionState - the current expression state (includes the context)
      valueSupplier - a supplier of the new value
      Throws:
      EvaluationException - if any problem occurs evaluating the expression or setting the new value
      Since:
      5.2.24
    • getChild

      public SpelNode getChild(int index)
      Description copied from interface: SpelNode
      Return the nth child under this node.
      Specified by:
      getChild in interface SpelNode
      Returns:
      the child node
      See Also:
    • getChildCount

      public int getChildCount()
      Description copied from interface: SpelNode
      Return the number of children under this node.
      Specified by:
      getChildCount in interface SpelNode
      Returns:
      the child count
      See Also:
    • getObjectClass

      public @Nullable Class<?> getObjectClass(@Nullable Object obj)
      Description copied from interface: SpelNode
      Determine the class of the object passed in, unless it is already a class object.
      Specified by:
      getObjectClass in interface SpelNode
      Parameters:
      obj - the object that the caller wants the class of
      Returns:
      the class of the object if it is not already a class object, or null if the object is null
    • getStartPosition

      public int getStartPosition()
      Description copied from interface: SpelNode
      Return the start position of this AST node in the expression string.
      Specified by:
      getStartPosition in interface SpelNode
      Returns:
      the start position
    • getEndPosition

      public int getEndPosition()
      Description copied from interface: SpelNode
      Return the end position of this AST node in the expression string.
      Specified by:
      getEndPosition in interface SpelNode
      Returns:
      the end position
    • isNullSafe

      public boolean isNullSafe()
      Determine if this node is the target of a null-safe navigation operation.

      The default implementation returns false.

      Returns:
      true if this node is the target of a null-safe operation
      Since:
      6.1.6
    • getExitDescriptor

      public @Nullable String getExitDescriptor()
    • getValue

      protected final <T> @Nullable T getValue(ExpressionState state, Class<T> desiredReturnType) throws EvaluationException
      Throws:
      EvaluationException
    • getValueRef

      protected ValueRef getValueRef(ExpressionState state) throws EvaluationException
      Throws:
      EvaluationException
    • getValueInternal

      public abstract TypedValue getValueInternal(ExpressionState expressionState) throws EvaluationException
      Throws:
      EvaluationException
    • generateCodeForArguments

      @Deprecated(since="6.2") protected static void generateCodeForArguments(org.springframework.asm.MethodVisitor mv, CodeFlow cf, Member member, SpelNodeImpl[] arguments)
      Generate code that handles building the argument values for the specified Member (method or constructor).

      This method takes into account whether the method or constructor was declared to accept varargs, and if it was then the argument values will be appropriately packaged into an array.

      Parameters:
      mv - the method visitor where code should be generated
      cf - the current CodeFlow
      member - the method or constructor for which arguments are being set up
      arguments - the expression nodes for the expression supplied argument values
    • generateCodeForArguments

      protected static void generateCodeForArguments(org.springframework.asm.MethodVisitor mv, CodeFlow cf, Executable executable, SpelNodeImpl[] arguments)
      Generate code that handles building the argument values for the specified Executable (method or constructor).

      This method takes into account whether the method or constructor was declared to accept varargs, and if it was then the argument values will be appropriately packaged into an array.

      Parameters:
      mv - the method visitor where code should be generated
      cf - the current CodeFlow
      executable - the Executable (method or constructor) for which arguments are being set up
      arguments - the expression nodes for the expression supplied argument values
      Since:
      6.2
    • generateCodeForArgument

      @Deprecated(since="6.2") protected static void generateCodeForArgument(org.springframework.asm.MethodVisitor mv, CodeFlow cf, SpelNodeImpl argument, String paramDesc)
      Generate bytecode that loads the supplied argument onto the stack.

      This method also performs any boxing, unboxing, or check-casting necessary to ensure that the type of the argument on the stack matches the supplied paramDesc.