Concepto: conceptos básicos MVEL
Sintaxis
MVEL es un lenguaje de expresión para aplicaciones basadas en Java. Su sintaxis es similar a la de Java, pero tiene algunas adiciones que lo hacen más eficiente para cotejar contenido.
Nota:
- MVEL utiliza espacios de nombres y clases de Java, pero tampoco puede declararlos.
- A diferencia de Java, MVEL se escribe dinámicamente, con una escritura opcional.
- Las expresiones en MVEL pueden ser instrucciones únicas o secuencias de comandos multilínea. En el caso de las secuencias de comandos multilínea, utilice un punto y coma para separar cada instrucción.
- MVEL funciona según el principio del último valor de salida. Admite lareturnpalabra clave, pero por lo general no es obligatoria.
- MVEL admite reglas de prioridad de operadores y utiliza corchetes para controlar el orden de ejecución.
- Puede encerrar literales de cadena MVEL entre comillas simples o dobles.
- El punto y coma es un carácter reservado en MVEL. No puede usarlo en expresiones. Utilizar(char) 59en su lugar. Ejemplo:props['string']='a;b'arroja un error. Este código no:props['string']= (char) 59 props['string_new']='a'props['string']'b'
Las expresiones MVEL pueden incluir:
- Expresiones booleanas
- Invocaciones de método
- Expresiones de propiedad
- Asignaciones de variables
Un ejemplo de una expresión de propiedad MVEL simple:
context.errorMessage
Extrae la propiedad
errorMessage
de la variable o el objeto de contexto context
.MVEL admite todos los operadores habituales de comparación, matemáticos y lógicos de Java. En esta tabla se resumen otros operadores MVEL destacados:
Operador | Descripción | Ejemplo |
|---|---|---|
new
| Crea una instancia de un objeto. | new String("foo")
|
with
| Realiza varias operaciones en una sola instancia de objeto. | with (value) { name = 'Foo', age = 50, sex = Sex.MALE }
|
assert
| Confirma que un valor es verdadero o falla con un AssertionError. | assert foo != null
|
contains
| Determina si el valor de la izquierda contiene el valor de la derecha. | var contains "Foo"
|
is o instance of
| Determina si el valor de la izquierda es un miembro de la clase de la derecha. | var instanceof String
|
strsim
| Compara cadenas y devuelve su similitud expresada como porcentaje. | "foobol" strsim "foobar"
|
soundslike
| Realiza una comparación de soundex entre dos cadenas. | "foobar" soundslike "fubar"
|
&
| Realiza una operación AND bit a bit. | foo & 5
|
|
| Realiza una operación OR bit a bit. | foo | 5
|
^
| Realiza una operación XOR bit a bit. | foo ^ 5
|
+
| Operador sobrecargado para concatenar dos cadenas. | "foo" + "bar"
|
#
| Concatena dos literales como cadenas. | 8 # 9
|
in
| Inspecciona los objetos de una colección. | (foo in list)
|
=
| Asigna un valor a una variable. | var = "foobar"
|
Prueba de valor
En Java, el operador
==
comprueba si las referencias apuntan al mismo objeto. Sin embargo, en MVEL, el operador de comparación ==
comprueba si los valores son iguales. La expresión MVEL foo == 'bar'
es el equivalente de Java foo.equals("bar")
.Un ejemplo de una expresión booleana de MVEL:
user.name == 'John Smith'
Devuelve
true
si el name
propiedad de la variable o del objeto de contexto user
es John Smith.MVEL emplea la conversión forzada de tipos. Si compara dos valores de distintos tipos, MVEL intenta forzar el valor de la derecha al tipo de la izquierda. Si eso no es posible, intenta forzar el valor de la izquierda al tipo de la derecha. Ejemplo:
"123" == 123;
Esta expresión devuelve
true
porque MVEL convierte el valor de la derecha en una cadena antes de realizar la comparación.Listas, asignaciones y matrices
Incluya las listas MVEL entre corchetes. Separe los elementos con comas. Ejemplo:
["Paris", "London", "Berlin"]
Escriba los mapas MVEL entre corchetes. Separe las claves y los valores con dos puntos. Ejemplo:
["Foo" : "Bar", "Bar" : "Foo"]
Escriba las matrices MVEL entre llaves. Separe los elementos con comas. Ejemplo:
{"Bill", "Bob", "Ben"}
Navegación de propiedades
MVEL proporciona una sintaxis única y unificada para acceder a propiedades, campos estáticos, listas, asignaciones y matrices.
En Java, puede acceder a una propiedad desde un objeto mediante esta instrucción:
context.getException().getCause()
En MVEL puede acceder a la misma propiedad mediante esta expresión:
context.exception.cause
Acceda a listas y matrices de la misma manera. Ejemplo:
parts[2]
Puede acceder a los mapas de la misma manera que a las matrices, pero puede pasar cualquier objeto como valor de índice. Ejemplo:
props["foobar"]
Si un mapa utiliza una cadena como clave, puede tratar el mapa como un objeto virtual. Ejemplo:
props.foobar
MVEL trata las cadenas como matrices con fines de indexación.
Este ejemplo devuelve
B
:foo = "Berlin"; foo[0];
Asignación
Puede asignar variables en una expresión MVEL para utilizarlas dentro de la expresión o para la extracción en momento de ejecución.
Dado que MVEL es un lenguaje que se escribe dinámicamente, no es preciso especificar un tipo al declarar una nueva variable. No obstante, puede hacerlo.
Estos dos ejemplos son válidos en MVEL:
str = "Some string"; String str = "Some string";
Al asignar un valor a una variable con tipo, MVEL intenta realizar una conversión de tipo automática. Ejemplo:
String num = 1;
Puede convertir el valor de una variable tipada dinámicamente a otro tipo. Ejemplo:
String num = 1;
Sección: Escritura y coerción
MVEL utiliza la escritura dinámica, con una escritura estática opcional. Los objetos nativos de Java se introducen de forma estática. Para interactuar con ellos, MVEL a veces debe realizar coerción de tipos, lo que puede tener consecuencias para el rendimiento.
MVEL fuerza automáticamente el tipo a lo que parece mejor para el valor actual. Esto significa que debe tener cuidado al trabajar con números. Pueden surgir errores en la aritmética de coma flotante porque MVEL descarta automáticamente la precisión infinita.
java.math.BigDecimal
a java.lang.Double
y java.lang.Long
. Esto puede causar problemas cuando el tipo de valor almacenado no es el esperado. En general, debe evitar realizar operaciones aritméticas no enteras con valores financieros en MVEL.La coerción de tipo de MVEL significa que puede llamar a métodos de Java sin ajustar las entradas. El intérprete o compilador analiza los tipos que se pasan al método y determina la coerción necesaria.
En el caso de un conflicto de tipo de matriz, MVEL intenta forzar toda la matriz al tipo de entrada necesario.
MVEL realiza cualquier coerción necesaria sobre una variable introducida estáticamente, siempre que el valor asignado sea coercible. Si no es así, se produce una excepción.