Package org.springframework.expression.spel.ast

# Class Operator

java.lang.Object
org.springframework.expression.spel.ast.SpelNodeImpl
org.springframework.expression.spel.ast.Operator

All Implemented Interfaces:
  `org.springframework.asm.Opcodes`, `SpelNode`

Direct Known Subclasses:
  `OpAnd`, `OpDec`, `OpDivide`, `OpEQ`, `OperatorBetween`, `OperatorInstanceof`, `OperatorMatches`, `OperatorPower`, `OpGE`, `OpGT`, `OpInc`, `OpLE`, `OpLT`, `OpMinus`, `OpModulus`, `OpMultiply`, `OpNE`, `OpOr`, `OpPlus`

public abstract class Operator extends SpelNodeImpl
Common supertype for operators that operate on either one or two operands. In the case of multiply or divide there would be two operands, but for unary plus or minus, there is only one.

Since:
  3.0
Author:
  Andy Clement, Juergen Hoeller, Giovanni Dall'Oglio Risso, Sam Brannen

## Nested Class Summary

Nested Classes
Modifier and Type
Class
Description
`protected static final class`
`Operator.DescriptorComparison`
A descriptor comparison encapsulates the result of comparing descriptor for two operands and describes at what level they are compatible.

## Field Summary

Fields
Modifier and Type
Field
Description
`protected String`
`leftActualDescriptor`
`protected String`
`rightActualDescriptor`

### Fields inherited from class org.springframework.expression.spel.ast.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, V9`

## Constructor Summary

Constructors
Constructor
Description
`Operator(String payload, int startPos, int endPos, SpelNodeImpl... operands)`

## Method Summary

Modifier and Type
Method
Description
`static boolean`
`equalityCheck(EvaluationContext context, Object left, Object right)`
Perform an equality check for the given operand values.
`protected void`
`generateComparisonCode(org.springframework.asm.MethodVisitor mv, CodeFlow cf, int compInstruction1, int compInstruction2)`
Numeric comparison operators share very similar generated code, only differing in two comparison instructions.
`SpelNodeImpl`
`getLeftOperand()`
`final String`
`getOperatorName()`
`SpelNodeImpl`
`getRightOperand()`
`protected boolean`
`isCompilableOperatorUsingNumerics()`
`String`
`toStringAST()`
String format for all operators is the same `'(' [operand] [operator] [operand] ')'`.

### Methods inherited from class org.springframework.expression.spel.ast.SpelNodeImpl

`generateCodeForArgument, generateCodeForArguments, generateCodeForArguments, getChild, getChildCount, getEndPosition, getExitDescriptor, getObjectClass, getStartPosition, getTypedValue, getValue, getValue, getValueInternal, getValueRef, isNullSafe, isWritable, nextChildIs, setValue, setValueInternal`

### 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`

## Field Details

### leftActualDescriptor

@Nullable protected String leftActualDescriptor

### rightActualDescriptor

@Nullable protected String rightActualDescriptor

## Constructor Details

### Operator

public Operator(String payload, int startPos, int endPos, SpelNodeImpl... operands)

## Method Details

### getLeftOperand

public SpelNodeImpl getLeftOperand()

### getRightOperand

public SpelNodeImpl getRightOperand()

### getOperatorName

public final String getOperatorName()

### toStringAST

public String toStringAST()
String format for all operators is the same `'(' [operand] [operator] [operand] ')'`.

Returns:
  the string form

### isCompilableOperatorUsingNumerics

protected boolean isCompilableOperatorUsingNumerics()

### generateComparisonCode

protected void generateComparisonCode(org.springframework.asm.MethodVisitor mv, CodeFlow cf, int compInstruction1, int compInstruction2)
Numeric comparison operators share very similar generated code, only differing in two comparison instructions.

### equalityCheck

public static boolean equalityCheck(EvaluationContext context, @Nullable Object left, @Nullable Object right)
Perform an equality check for the given operand values.

This method is not just used for reflective comparisons in subclasses but also from compiled expression code, which is why it needs to be declared as `public static` here.

Parameters:
  `context` - the current evaluation context
  `left` - the left-hand operand value
  `right` - the right-hand operand value