# Class ValueExpressionImpl

java.lang.Object
javax.el.Expression
javax.el.ValueExpression
org.apache.el.ValueExpressionImpl

All Implemented Interfaces:
  `Externalizable, Serializable`

public final class ValueExpressionImpl extends ValueExpression implements Externalizable
An `Expression` that can get or set a value.

In previous incarnations of this API, expressions could only be read. `ValueExpression` objects can now be used both to retrieve a value and to set a value. Expressions that can have a value set on them are referred to as l-value expressions. Those that cannot are referred to as r-value expressions. Not all r-value expressions can be used as l-value expressions (e.g. `"${1+1}"` or `"${firstName} ${lastName}"`). See the EL Specification for details. Expressions that cannot be used as l-values must always return `true` from `isReadOnly()`.

The `ExpressionFactory.createValueExpression(ELContext, String, Class)` method can be used to parse an expression string and return a concrete instance of `ValueExpression` that encapsulates the parsed expression. The `FunctionMapper` is used at parse time, not evaluation time, so one is not needed to evaluate an expression using this class. However, the `ELContext` is needed at evaluation time.

The `getValue(ELContext)`, `setValue(ELContext, Object)`, `isReadOnly(ELContext)` and `getType(ELContext)` methods will evaluate the expression each time they are called. The `ELResolver` in the `ELContext` is used to resolve the top-level variables and to determine the behavior of the `.` and `[]` operators. For any of the four methods, the `ELResolver.getValue(ELContext, Object, Object)` method is used to resolve all properties up to but excluding the last one. This provides the `base` object. At the last resolution, the `ValueExpression` will call the corresponding `ELResolver.getValue(ELContext, Object, Object)`, `ELResolver.setValue(ELContext, Object, Object, Object)`, `ELResolver.isReadOnly(ELContext, Object, Object)` or `ELResolver.getType(ELContext, Object, Object)` method, depending on which was called on the `ValueExpression`.

See the notes about comparison, serialization and immutability in the `Expression` javadocs.

See Also:
  - `ELResolver`
  - `Expression`
  - `ExpressionFactory`
  - `ValueExpression`
  - Serialized Form

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `ValueExpressionImpl()`
  `ValueExpressionImpl(String expr, org.apache.el.parser.Node node, FunctionMapper fnMapper, VariableMapper varMapper, Class<?> expectedType)`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `boolean`
  `equals(Object obj)`
  `Class<?>`
  `getExpectedType()`
  `String`
  `getExpressionString()`
  Returns the type the result of the expression will be coerced to after evaluation.
  `Class<?>`
  `getType(ELContext context)`
  `Object`
  `getValue(ELContext context)`
  `ValueReference`
  `getValueReference(ELContext context)`
  `int`
  `hashCode()`
  `boolean`
  `isLiteralText()`
  `boolean`
  `isReadOnly(ELContext context)`
  `void`
  `readExternal(ObjectInput in)`
  `void`
  `setValue(ELContext context, Object value)`
  `String`
  `toString()`
  `void`
  `writeExternal(ObjectOutput out)`

  ### Methods inherited from class Object

  `clone, finalize, getClass, notify, notifyAll, wait, wait, wait`

- ## Constructor Details

  - ### ValueExpressionImpl

    public ValueExpressionImpl()

  - ### ValueExpressionImpl

    public ValueExpressionImpl(String expr, org.apache.el.parser.Node node, FunctionMapper fnMapper, VariableMapper varMapper, Class<?> expectedType)

- ## Method Details

  - ### equals

    public boolean equals(Object obj)
    Specified by:
      `equals` in class `Expression`

  - ### getExpectedType

    public Class<?> getExpectedType()
    Specified by:
      `getExpectedType` in class `ValueExpression`

  - ### getExpressionString

    public String getExpressionString()
    Returns the type the result of the expression will be coerced to after evaluation.
    Specified by:
      `getExpressionString` in class `Expression`
    Returns:
      the `expectedType` passed to the `ExpressionFactory.createValueExpression` method that created this `ValueExpression`.
    See Also:
      - `Expression.getExpressionString()`

  - ### getType

    public Class<?> getType(ELContext context) throws PropertyNotFoundException, ELException
    Specified by:
      `getType` in class `ValueExpression`
    Parameters:
      `context` - The EL context for this evaluation
    Returns:
      The type of the result of this value expression
    Throws:
      `PropertyNotFoundException` - If a property/variable resolution failed because no match was found or a match was found but was not readable
      `ELException` - Wraps any exception throw whilst resolving a property or variable

  - ### getValue

    public Object getValue(ELContext context) throws PropertyNotFoundException, ELException
    Specified by:
      `getValue` in class `ValueExpression`
    Parameters:
      `context` - The EL context for this evaluation
    Returns:
      The result of evaluating this value expression
    Throws:
      `PropertyNotFoundException` - If a property/variable resolution failed because no match was found or a match was found but was not readable
      `ELException` - Wraps any exception throw whilst resolving a property or variable

  - ### hashCode

    public int hashCode()
    Specified by:
      `hashCode` in class `Expression`

  - ### isLiteralText

    public boolean isLiteralText()
    Specified by:
      `isLiteralText` in class `Expression`

  - ### isReadOnly

    public boolean isReadOnly(ELContext context) throws PropertyNotFoundException, ELException
    Specified by:
      `isReadOnly` in class `ValueExpression`
    Parameters:
      `context` - The EL context for this evaluation
    Returns:
      `true` if this expression is read only otherwise `false`
    Throws:
      `PropertyNotFoundException` - If a property/variable resolution failed because no match was found or a match was found but was not readable
      `ELException` - Wraps any exception throw whilst resolving a property or variable

  - ### readExternal

    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
    Specified by:
      `readExternal` in interface `Externalizable`
    Throws:
      `IOException`
      `ClassNotFoundException`

  - ### setValue

    public void setValue(ELContext context, Object value) throws PropertyNotFoundException, PropertyNotWritableException, ELException
    Specified by:
      `setValue` in class `ValueExpression`
    Parameters:
      `context` - The EL context for this evaluation
      `value` - The value to set the property to which this value expression refers
    Throws:
      `PropertyNotFoundException` - If a property/variable resolution failed because no match was found
      `PropertyNotWritableException` - If a property/variable resolution failed because a match was found but was not writable
      `ELException` - Wraps any exception throw whilst resolving a property or variable

  - ### writeExternal

    public void writeExternal(ObjectOutput out) throws IOException
    Specified by:
      `writeExternal` in interface `Externalizable`
    Throws:
      `IOException`

  - ### toString

    public String toString()
    Overrides:
      `toString` in class `Object`

  - ### getValueReference

    public ValueReference getValueReference(ELContext context)
    Overrides:
      `getValueReference` in class `ValueExpression`
    Parameters:
      `context` - The EL context for this evaluation
    Returns:
      This default implementation always returns `null`