Class SpelNodeImpl
- java.lang.Object
- org.springframework.expression.spel.ast.SpelNodeImpl
- 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, Opcodes
The common supertype of all AST nodes in a parsed Spring Expression Language format expression.- Since:
- 3.0
- Author:
- Andy Clement, Juergen Hoeller
Field Summary
Fields Modifier and Type Field Description protected SpelNodeImpl[]childrenprotected StringexitTypeDescriptorIndicates 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_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, ASM4, ASM5, ASM6, ASM7, ASM8_EXPERIMENTAL, 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, V9
Constructor Summary
Constructors Constructor Description SpelNodeImpl(int startPos, int endPos, SpelNodeImpl... operands)
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description voidgenerateCode(MethodVisitor mv, CodeFlow cf)Generate the bytecode for this node into the supplied visitor.protected static voidgenerateCodeForArgument(MethodVisitor mv, CodeFlow cf, SpelNodeImpl argument, String paramDesc)Ask an argument to generate its bytecode and then follow it up with any boxing/unboxing/checkcasting to ensure it matches the expected parameter descriptor.protected static voidgenerateCodeForArguments(MethodVisitor mv, CodeFlow cf, Member member, SpelNodeImpl[] arguments)Generate code that handles building the argument values for the specified method.SpelNodegetChild(int index)Helper method that returns a SpelNode rather than an Antlr Tree node.intgetChildCount()Return the number of children under this node.intgetEndPosition()Return the end position of this AST node in the expression string.StringgetExitDescriptor()Class<?>getObjectClass(Object obj)Determine the class of the object passed in, unless it is already a class object.intgetStartPosition()Return the start position of this AST node in the expression string.TypedValuegetTypedValue(ExpressionState expressionState)Evaluate the expression node in the context of the supplied expression state and return the typed value.ObjectgetValue(ExpressionState expressionState)Evaluate the expression node in the context of the supplied expression state and return the value.protected <T> TgetValue(ExpressionState state, Class<T> desiredReturnType)abstract TypedValuegetValueInternal(ExpressionState expressionState)protected ValueRefgetValueRef(ExpressionState state)booleanisCompilable()Check whether a node can be compiled to bytecode.booleanisWritable(ExpressionState expressionState)Determine if this expression node will support a setValue() call.protected booleannextChildIs(Class<?>... classes)Returntrueif the next child is one of the specified classes.voidsetValue(ExpressionState expressionState, Object newValue)Evaluate the expression to a node and then set the new value 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
toStringAST
Field Detail
children
protected SpelNodeImpl[] children
exitTypeDescriptor
@Nullable protected volatile 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 Detail
SpelNodeImpl
public SpelNodeImpl(int startPos, int endPos, SpelNodeImpl... operands)
Method Detail
nextChildIs
protected boolean nextChildIs(Class<?>... classes)
Returntrueif the next child is one of the specified classes.
getValue
@Nullable public final Object getValue(ExpressionState expressionState) throws EvaluationException
Description copied from interface:SpelNodeEvaluate the expression node in the context of the supplied expression state and return the value.- Specified by:
getValuein interfaceSpelNode- Parameters:
expressionState- the current expression state (includes the context)- Returns:
- the value of this node evaluated against the specified state
- Throws:
EvaluationException
getTypedValue
public final TypedValue getTypedValue(ExpressionState expressionState) throws EvaluationException
Description copied from interface:SpelNodeEvaluate the expression node in the context of the supplied expression state and return the typed value.- Specified by:
getTypedValuein interfaceSpelNode- Parameters:
expressionState- the current expression state (includes the context)- Returns:
- the type value of this node evaluated against the specified state
- Throws:
EvaluationException
isWritable
public boolean isWritable(ExpressionState expressionState) throws EvaluationException
Description copied from interface:SpelNodeDetermine if this expression node will support a setValue() call.- Specified by:
isWritablein interfaceSpelNode- 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:SpelNodeEvaluate 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:
setValuein interfaceSpelNode- 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
getChild
public SpelNode getChild(int index)
Description copied from interface:SpelNodeHelper method that returns a SpelNode rather than an Antlr Tree node.
getChildCount
public int getChildCount()
Description copied from interface:SpelNodeReturn the number of children under this node.- Specified by:
getChildCountin interfaceSpelNode- Returns:
- the child count
getObjectClass
@Nullable public Class<?> getObjectClass(@Nullable Object obj)
Description copied from interface:SpelNodeDetermine the class of the object passed in, unless it is already a class object.- Specified by:
getObjectClassin interfaceSpelNode- 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
nullif the object isnull
getStartPosition
public int getStartPosition()
Description copied from interface:SpelNodeReturn the start position of this AST node in the expression string.- Specified by:
getStartPositionin interfaceSpelNode- Returns:
- the start position
getEndPosition
public int getEndPosition()
Description copied from interface:SpelNodeReturn the end position of this AST node in the expression string.- Specified by:
getEndPositionin interfaceSpelNode- Returns:
- the end position
isCompilable
public boolean isCompilable()
Check whether a node can be compiled to bytecode. The reasoning in each node may be different but will typically involve checking whether the exit type descriptor of the node is known and any relevant child nodes are compilable.- Returns:
trueif this node can be compiled to bytecode
generateCode
public void generateCode(MethodVisitor mv, CodeFlow cf)
Generate the bytecode for this node into the supplied visitor. Context info about the current expression being compiled is available in the codeflow object, e.g. including information about the type of the object currently on the stack.- Parameters:
mv- the ASM MethodVisitor into which code should be generatedcf- a context object with info about what is on the stack
getExitDescriptor
@Nullable public String getExitDescriptor()
getValue
@Nullable protected final <T> 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
protected static void generateCodeForArguments(MethodVisitor mv, CodeFlow cf, Member member, SpelNodeImpl[] arguments)
Generate code that handles building the argument values for the specified method. This method will take account of whether the invoked method is a varargs method and if it is then the argument values will be appropriately packaged into an array.- Parameters:
mv- the method visitor where code should be generatedcf- the current codeflowmember- the method or constructor for which arguments are being setuparguments- the expression nodes for the expression supplied argument values
generateCodeForArgument
protected static void generateCodeForArgument(MethodVisitor mv, CodeFlow cf, SpelNodeImpl argument, String paramDesc)
Ask an argument to generate its bytecode and then follow it up with any boxing/unboxing/checkcasting to ensure it matches the expected parameter descriptor.