Class ReflectivePropertyAccessor.OptimalPropertyAccessor

java.lang.Object
org.springframework.expression.spel.support.ReflectivePropertyAccessor.OptimalPropertyAccessor
All Implemented Interfaces:
org.springframework.asm.Opcodes, PropertyAccessor, CompilablePropertyAccessor
Enclosing class:
ReflectivePropertyAccessor

public static class ReflectivePropertyAccessor.OptimalPropertyAccessor extends Object implements CompilablePropertyAccessor
An optimized form of a PropertyAccessor that will use reflection but only knows how to access a particular property on a particular class. This is unlike the general ReflectivePropertyResolver which manages a cache of methods/fields that may be invoked to access different properties on different classes. This optimal accessor exists because looking up the appropriate reflective object by class/name on each read is not cheap.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    final Member
    The member being accessed.

    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, V9
  • Method Summary

    Modifier and Type
    Method
    Description
    boolean
    canRead(EvaluationContext context, Object target, String name)
    Called to determine if a resolver instance is able to access a specified property on a specified target object.
    boolean
    canWrite(EvaluationContext context, Object target, String name)
    Called to determine if a resolver instance is able to write to a specified property on a specified target object.
    void
    generateCode(String propertyName, org.springframework.asm.MethodVisitor mv, CodeFlow cf)
    Generate the bytecode the performs the access operation into the specified MethodVisitor using context information from the CodeFlow where necessary.
    Return the type of the accessed property - may only be known once an access has occurred.
    Class<?>[]
    Return an array of classes for which this resolver should be called.
    boolean
    Return true if this property accessor is currently suitable for compilation.
    read(EvaluationContext context, Object target, String name)
    Called to read a property from a specified target object.
    void
    write(EvaluationContext context, Object target, String name, Object newValue)
    Called to write to a property on a specified target object.

    Methods inherited from class java.lang.Object

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

    • member

      public final Member member
      The member being accessed.
  • Method Details

    • getSpecificTargetClasses

      @Nullable public Class<?>[] getSpecificTargetClasses()
      Description copied from interface: PropertyAccessor
      Return an array of classes for which this resolver should be called.

      Returning null indicates this is a general resolver that can be called in an attempt to resolve a property on any type.

      Specified by:
      getSpecificTargetClasses in interface PropertyAccessor
      Returns:
      an array of classes that this resolver is suitable for (or null if a general resolver)
    • canRead

      public boolean canRead(EvaluationContext context, @Nullable Object target, String name) throws AccessException
      Description copied from interface: PropertyAccessor
      Called to determine if a resolver instance is able to access a specified property on a specified target object.
      Specified by:
      canRead in interface PropertyAccessor
      Parameters:
      context - the evaluation context in which the access is being attempted
      target - the target object upon which the property is being accessed
      name - the name of the property being accessed
      Returns:
      true if this resolver is able to read the property
      Throws:
      AccessException - if there is any problem determining whether the property can be read
    • read

      public TypedValue read(EvaluationContext context, @Nullable Object target, String name) throws AccessException
      Description copied from interface: PropertyAccessor
      Called to read a property from a specified target object. Should only succeed if PropertyAccessor.canRead(org.springframework.expression.EvaluationContext, java.lang.Object, java.lang.String) also returns true.
      Specified by:
      read in interface PropertyAccessor
      Parameters:
      context - the evaluation context in which the access is being attempted
      target - the target object upon which the property is being accessed
      name - the name of the property being accessed
      Returns:
      a TypedValue object wrapping the property value read and a type descriptor for it
      Throws:
      AccessException - if there is any problem accessing the property value
    • canWrite

      public boolean canWrite(EvaluationContext context, @Nullable Object target, String name)
      Description copied from interface: PropertyAccessor
      Called to determine if a resolver instance is able to write to a specified property on a specified target object.
      Specified by:
      canWrite in interface PropertyAccessor
      Parameters:
      context - the evaluation context in which the access is being attempted
      target - the target object upon which the property is being accessed
      name - the name of the property being accessed
      Returns:
      true if this resolver is able to write to the property
    • write

      public void write(EvaluationContext context, @Nullable Object target, String name, @Nullable Object newValue)
      Description copied from interface: PropertyAccessor
      Called to write to a property on a specified target object. Should only succeed if PropertyAccessor.canWrite(org.springframework.expression.EvaluationContext, java.lang.Object, java.lang.String) also returns true.
      Specified by:
      write in interface PropertyAccessor
      Parameters:
      context - the evaluation context in which the access is being attempted
      target - the target object upon which the property is being accessed
      name - the name of the property being accessed
      newValue - the new value for the property
    • isCompilable

      public boolean isCompilable()
      Description copied from interface: CompilablePropertyAccessor
      Return true if this property accessor is currently suitable for compilation.
      Specified by:
      isCompilable in interface CompilablePropertyAccessor
    • getPropertyType

      public Class<?> getPropertyType()
      Description copied from interface: CompilablePropertyAccessor
      Return the type of the accessed property - may only be known once an access has occurred.
      Specified by:
      getPropertyType in interface CompilablePropertyAccessor
    • generateCode

      public void generateCode(String propertyName, org.springframework.asm.MethodVisitor mv, CodeFlow cf)
      Description copied from interface: CompilablePropertyAccessor
      Generate the bytecode the performs the access operation into the specified MethodVisitor using context information from the CodeFlow where necessary.
      Specified by:
      generateCode in interface CompilablePropertyAccessor
      Parameters:
      propertyName - the name of the property
      mv - the ASM method visitor into which code should be generated
      cf - the current state of the expression compiler