Conceito: noções básicas sobre MVEL
Sintaxe
MVEL é uma linguagem de expressão para aplicativos baseados em Java. Sua sintaxe é semelhante à do Java, porém com alguns acréscimos que tornam o MVEL mais eficiente na correspondência do conteúdo.
Observação:
- O MVEL usa namespaces e classes do Java, mas não pode declará-los.
- Ao contrário do Java, o MVEL tem tipagem dinâmica, com tipagem opcional.
- As expressões MVEL podem ser instruções únicas ou scripts com várias linhas. Para scripts com várias linhas, use um ponto e vírgula para separar cada instrução.
- A Mvel opera com base no início do último valor a ser emitido. Ele tem suporte parareturnpalavra-chave , mas geralmente não a requer.
- A Mvel oferece suporte a regras de precedência de operador e usa colchetes para controlar a ordem de execução.
- Você pode colocar literais de cadeia de caracteres do MVEL entre aspas simples ou duplas.
- O ponto e vírgula é um caractere reservado no MVEL. Você não pode usá-la em expressões. Uso(char) 59Em vez disso, Exemplo:props['string']='a;b'gera um erro. Esse código não:props['string']= (char) 59 props['string_new']='a'props['string']'b'
As expressões Mvel podem incluir:
- Expressões boolianas
- Invocações de método
- Expressões de propriedade
- Atribuições de variáveis
Um exemplo de expressão de propriedade Mvel simples:
context.errorMessage
Ele extrai a propriedade
errorMessage
da variável ou do objeto de contexto context
.O Mvel tem suporte para todos os operadores comuns de comparação, matemáticos e lógicos do Java. Esta tabela resume outros operadores de destaque do MVEL:
Operador | Descrição | Exemplo |
|---|---|---|
new
| Instancia um objeto. | new String("foo")
|
with
| Executa várias operações em uma única instância de objeto. | with (value) { name = 'Foo', age = 50, sex = Sex.MALE }
|
assert
| Declara que um valor é verdadeiro ou falha com um AssertionError. | assert foo != null
|
contains
| Determina se o valor à esquerda contém o valor à direita. | var contains "Foo"
|
is ou instance of
| Determina se o valor à esquerda é um membro da classe à direita. | var instanceof String
|
strsim
| Compara cadeias de caracteres e retorna a similaridade deles expressa como um percentual. | "foobol" strsim "foobar"
|
soundslike
| Executa uma comparação workex entre duas cadeias de caracteres. | "foobar" soundslike "fubar"
|
&
| Executa uma operação AND em nível de bit. | foo & 5
|
|
| Executa uma operação OR de bit a bit. | foo | 5
|
^
| Executa uma operação XOR bit a bit. | foo ^ 5
|
+
| Operador sobrecarregado para concatenar duas cadeias de caracteres. | "foo" + "bar"
|
#
| Concatena dois literais como cadeias de caracteres. | 8 # 9
|
in
| Inspeciona objetos dentro de uma coleção. | (foo in list)
|
=
| Atribui um valor a uma variável. | var = "foobar"
|
Teste de valor
Em Java, o operador
==
verifica se as referências apontam para o mesmo objeto. No entanto, em Mvel, o operador de comparação ==
verifica se os valores são iguais. A expressão Mvel foo == 'bar'
é equivalente ao do Java foo.equals("bar")
.Um exemplo de expressão booliana Mvel:
user.name == 'John Smith'
Retorna
true
se o name
propriedade da variável ou do objeto de contexto user
é John Smith.O Mvel emprega coerção de tipo. Se você compara dois valores de tipos diferentes, o MVEL tenta converter o valor à direita no tipo à esquerda. Se isso não é possível, ele tenta converter o valor à esquerda no tipo à direita. Exemplo:
"123" == 123;
Essa expressão retorna
true
porque o Mvel converte o valor à direita em uma cadeia de caracteres antes de executar a comparação.Listas, mapas e matrizes
Coloque as listas em MVEL entre colchetes. Separe os itens com vírgulas. Exemplo:
["Paris", "London", "Berlin"]
Coloque os mapas Mvel entre colchetes. Separe chaves e valores com dois pontos. Exemplo:
["Foo" : "Bar", "Bar" : "Foo"]
Coloque as matrizes Mvel entre colchetes. Separe os itens com vírgulas. Exemplo:
{"Bill", "Bob", "Ben"}
Navegação em Propriedades
O MVEL oferece uma sintaxe única e unificada para acessar propriedades, campos estáticos, listas, mapas e matrizes.
Em Java, você pode acessar uma propriedade de um objeto usando esta instrução:
context.getException().getCause()
No Mvel, você pode acessar a mesma propriedade usando esta expressão:
context.exception.cause
Acesse listas e matrizes da mesma maneira. Exemplo:
parts[2]
Você acessa mapas da mesma forma que as matrizes, mas pode passar qualquer objeto como o valor de índice. Exemplo:
props["foobar"]
Se um mapa usa uma cadeia de caracteres como chave, você pode tratar o próprio mapa como um objeto virtual. Exemplo:
props.foobar
A Mvel trata cadeias de caracteres como matrizes para fins de indexação.
Este exemplo retorna
B
:foo = "Berlin"; foo[0];
Atribuição
Você pode atribuir variáveis em uma expressão MVEL para uso na expressão ou para a extração durante o tempo de execução.
Como o MVEL é uma linguagem de tipagem dinâmica, você não precisa especificar um tipo quando declara uma nova variável. No entanto, pode fazer isso.
Estes dois exemplos são válidos no Mvel:
str = "Some string"; String str = "Some string";
Ao atribuir um valor a uma variável digitada, o Mvel tenta executar a conversão de tipo automática. Exemplo:
String num = 1;
Você pode converter o valor de uma variável dinamicamente em outro tipo. Exemplo:
String num = 1;
Seção: digitação e coação
O MVEL usa tipagem dinâmica, com tipagem estática opcional. Objetos Java nativos são tipados estaticamente. Para interagir com eles, às vezes o MVEL deve executar coerção de tipos, o que pode ter implicações no desempenho.
O MVEL converte automaticamente o tipo em um que pareça ser melhor para o valor atual. Isso significa que você deve ter cuidado ao trabalhar com números. Podem surgir erros na aritmética de ponto flutuante porque o Mvel é lançado automaticamente a partir da precisão infinita
java.math.BigDecimal
a java.lang.Double
e java.lang.Long
. Isso pode causar problemas quando o tipo do valor armazenado não é o esperado. Em geral, você deve evitar executar em MVEL operações aritméticas com valores financeiros usando números decimais.A coerção de tipos do MVEL significa que você pode chamar métodos Java sem ajustar as entradas. O interpretador ou compilador analisa os tipos que você está passando para o método e determina qual conversão é necessária.
No caso de um conflito de tipo de matriz, o MVEL tenta converter a matriz inteira no tipo de entrada necessário.
O MVEL executa todas as conversões necessárias em uma variável tipada estaticamente, desde que seja possível converter o valor atribuído. Caso contrário, ocorre uma exceção.