概念: MVEL の基礎
構文
MVEL は Java ベースのアプリケーション用の式言語です。構文は Java に似ていますが、コンテンツのマッチングをより効率的に行うためのいくつかの追加機能があります。
注:
- MVEL は Java のネームスペースとクラスを使用するが、それ自体を宣言することはできない。
- Java とは異なり、MVEL は動的に型指定されるが、任意で型指定が可能である。
- MVEL 式には、単一のステートメントまたは複数行のスクリプトを使用できる。複数行のスクリプトの場合は、セミコロンを使用して各ステートメントを区切ります。
- MVER は、最後の値の終了の原則に基づいて機能します。以下がサポートされています。returnキーワード。ただし通常は必要ありません。
- MVE は演算子の優先順位ルールをサポートし、かっこ付けを使用して実行順序を制御します。
- MVEL 文字列リテラルは、一重引用符または二重引用符で囲むことができる。
- セミコロンは MVEL の予約文字である。式では使用できません。用途(char) 59代わりに。例:props['string']='a;b'はエラーを返します。このコードの理由は次のとおりです。props['string']= (char) 59 props['string_new']='a'props['string']'b'
Mレベルの式には以下のものがあります。
- ブール式
- メソッド呼び出し
- プロパティ式
- 変数の割当
単純な Mレベル プロパティ式の例:
context.errorMessage
プロパティを抽出します
errorMessage
変数またはコンテキスト オブジェクトから context
。MVER は、通常の Java 比較演算子、数学演算子、論理演算子をすべてサポートします。次のテーブルは、その他の重要な MVEL 演算子をまとめたものです。
演算子 | 説明 | 例 |
|---|---|---|
new
| オブジェクトのインスタンスを作成します。 | new String("foo")
|
with
| 単一のオブジェクト インスタンスに複数の操作を実行します。 | with (value) { name = 'Foo', age = 50, sex = Sex.MALE }
|
assert
| 値が真であるか、アサーションエラーで失敗したことを確認します。 | assert foo != null
|
contains
| 左の値が右の値を含むかどうかを判断します。 | var contains "Foo"
|
is または instance of
| 左側の値が右側のクラスのメンバーであるかどうかを判断します。 | var instanceof String
|
strsim
| 文字列を比較し、その類似度をパーセントで返します。 | "foobol" strsim "foobar"
|
soundslike
| 2 つの文字列の最新の比較を実行します。 | "foobar" soundslike "fubar"
|
&
| ビットごとの AND 演算を実行します。 | foo & 5
|
|
| ビット基準 OR 演算を実行します。 | foo | 5
|
^
| ビットごとの XOR 演算を実行します。 | foo ^ 5
|
+
| 2 つの文字列を連結するオーバーロード演算子。 | "foo" + "bar"
|
#
| 2 つのリテラルを文字列として連結します。 | 8 # 9
|
in
| コレクション内のオブジェクトを検証します。 | (foo in list)
|
=
| 変数に値を割り当てます。 | var = "foobar"
|
値テスト
Java の演算子は、
==
参照が同じオブジェクトを指しているかどうかをチェックします。ただし、MVE では、比較演算子は ==
値が等しいかどうかをチェックします。M休暇式 foo == 'bar'
は Java と同等です foo.equals("bar")
。M送金レベルのブール式の例を次に示します。
user.name == 'John Smith'
返されます
true
次の条件を満たす場合 name
変数またはコンテキスト オブジェクトのプロパティ user
は John Smith です。M休暇・休職タイプの補償タイプの異なる 2 つの値を比較する場合、MVEL は右側の値を左側のタイプに強制変換しようとします。それが不可能な場合は、左側の値を右側のタイプに強制変換しようとします。例:
"123" == 123;
この式の戻り値
true
MVER は比較を実行する前に、右側の値を文字列に強制するためです。リスト、マップ、配列
MVEL リストは角かっこで囲みます。アイテムはカンマで区切ります。例:
["Paris", "London", "Berlin"]
角かっこで Mレベル マップを囲みます。キーと値はコロンで区切ります。例:
["Foo" : "Bar", "Bar" : "Foo"]
MVER 配列数式をかっこで囲みます。アイテムはカンマで区切ります。例:
{"Bill", "Bob", "Ben"}
プロパティ ナビゲーション
MVEL は、プロパティ、静的フィールド、リスト、マップ、および配列にアクセスするための単一の統合された構文を提供します。
Java では、次のステートメントを使用して、オブジェクトからプロパティにアクセスできます。
context.getException().getCause()
MVE では、次の式を使用して同じプロパティにアクセスできます。
context.exception.cause
リストおよび配列数式にも同様にアクセスします。例:
parts[2]
配列と同じ方法でマップにアクセスしますが、任意のオブジェクトをインデックス値として渡すことができます。例:
props["foobar"]
マップがキーとして文字列を使用している場合、マップ自体を仮想オブジェクトとして扱うことができます。例:
props.foobar
M Vレベルでは、文字列はインデックス付けするための配列として扱われます。
この例では、次が返されます:
B
:foo = "Berlin"; foo[0];
割当
MVEL 式に変数を割り当てて、式内で使用したり、実行時に抽出したりすることができます。
MVEL は動的型付け言語であるため、新しい変数を宣言するときに型を指定する必要はありません。しかし、それを行うことは可能です。
次に示す両方の例が M検証に有効です。
str = "Some string"; String str = "Some string";
型付き変数に値を割り当てる際、型の自動変換を実行しようとします。例:
String num = 1;
動的型の変数の値を別の型にキャストできます。例:
String num = 1;
セクション: 型設定と訂正
MVEL では動的型付けが使用され、オプションで静的型付けも使用されます。ネイティブ Java オブジェクトは静的型付けされます。MVEL は、それらとやり取りするために型の強制変換を実行しなければならない場合があり、パフォーマンスに影響する可能性があります。
MVEL は、現在の値に最適と思われるタイプに自動的に型変換します。つまり、数字を操作する際には注意が必要ということです。/
java.math.BigDecimal
終了 java.lang.Double
および java.lang.Long
。このため、保存された値のタイプが想定と異なる場合、問題が発生する可能性があります。一般に、MVEL の財務値で非整数の演算を実行することは避ける必要があります。MVEL の型強制は、入力を調整せずに Java メソッドを呼び出すことができることを意味します。インタプリタまたはコンパイラは、メソッドに渡す型を分析し、どのような型強制が必要かを判断します。
配列タイプの競合が発生した場合、MVEL は配列全体を必要な入力型に強制しようとします。
割り当てられた値が強制可能である場合、MVEL は静的型付け変数で必要な型強制を実行します。強制を実行できない場合は、例外が発生します。