Class Indexer

java.lang.Object
org.springframework.expression.spel.ast.SpelNodeImpl
org.springframework.expression.spel.ast.Indexer
All Implemented Interfaces:
org.springframework.asm.Opcodes, SpelNode

public class Indexer extends SpelNodeImpl
An Indexer can index into some proceeding structure to access a particular element of the structure.

Numerical index values are zero-based, such as when accessing the nth element of an array in Java.

Supported Structures

  • Arrays: the nth element
  • Collections (lists, sets, etc.): the nth element
  • Strings: the nth character as a String
  • Maps: the value for the specified key
  • Objects: the property with the specified name
  • Custom Structures: via registered IndexAccessor implementations

Null-safe Indexing

As of Spring Framework 6.2, null-safe indexing is supported via the '?.' operator. For example, 'colors?.[0]' will evaluate to null if colors is null and will otherwise evaluate to the 0th color. As of Spring Framework 7.0, null-safe indexing also applies when indexing into a structure contained in an Optional. For example, if colors is of type Optional<Colors>, the expression 'colors?.[0]' will evaluate to null if colors is null or empty and will otherwise evaluate to the 0th color, effectively colors.get()[0].

Since:
3.0
Author:
Andy Clement, Phillip Webb, Stephane Nicoll, Sam Brannen
See Also:
  • Field Summary

    Fields inherited from class SpelNodeImpl

    children, exitTypeDescriptor

    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, V25, V26, V9
  • Constructor Summary

    Constructors
    Constructor
    Description
    Indexer(boolean nullSafe, int startPos, int endPos, SpelNodeImpl indexExpression)
    Create an Indexer with the given null-safe flag, start position, end position, and index expression.
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    generateCode(org.springframework.asm.MethodVisitor mv, CodeFlow cf)
    Generate the bytecode for this node into the supplied MethodVisitor.
     
    protected ValueRef
     
    boolean
    Determine if this node can be compiled to bytecode.
    final boolean
    Does this node represent a null-safe index operation?
    boolean
    isWritable(ExpressionState expressionState)
    Determine if this expression node will support a setValue() call.
    Evaluate the expression to a node and then set the new value created by the specified Supplier on that node.
    Return the string form of this AST node.

    Methods inherited from class Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • Indexer

      public Indexer(boolean nullSafe, int startPos, int endPos, SpelNodeImpl indexExpression)
      Create an Indexer with the given null-safe flag, start position, end position, and index expression.
      Since:
      6.2
  • Method Details