Анализ выражений EL используется в некоторых случаях, связанных с динамической конфигурацией правил. Например, внедрение внешних правил в механизм рабочего процесса, анализ SpEL в Spring Framework и т. д. Фреймворк jfireEL поддерживает распространённые выражения EL, такие как арифметические операции, получение элементов массива, списка, карты, пар ключ-значение, свойств, вызов методов, каскадный вызов, определение классов и перечислений, а также получение объектов и др.
По сравнению со SpringEL, jfireEL более лаконичен в выражении. Например, для сравнения свойств в SpringEL можно написать:
vars['home'].bool(vars['person'].getAge() + '12' != vars['value'])
.
В jfireEL это будет выглядеть так: home.bool(person.getAge() + '12' != value)
. Очевидно, что jfireEL легче читать.
Приглашаем присоединиться к техническому обсуждению в группе 186233599 и подписаться на публичный аккаунт автора: «Ветер и огонь говорят».
Для сравнения производительности jfireEL, BeetlEL и SpringEL было использовано выражение vars['home'].bool(vars['person'].getAge() + '12' != vars['value'])
, которое было предварительно разогрето одинаковое количество раз для обеспечения инициализации. Результаты сравнения производительности трёх фреймворков следующие:
Сначала необходимо добавить зависимость Maven:
<dependency>
<groupId>com.jfirer</groupId>
<artifactId>jfireEl</artifactId>
<version>1.0</version>
</dependency>
При использовании в коде сначала выполняется анализ выражения EL, после чего можно использовать этот внешний параметр для оценки выражения.
int[] array = new int[]
{
1, 2, 3, 4
};
Map < String, Object > vars = new HashMap < String, Object > ();
vars.put("array", array);
Expression lexer = Expression.parse("array[2]");//используется статический метод parse для разбора строки в виде выражения EL и получения экземпляра выражения. Этот экземпляр является потокобезопасным и может использоваться повторно без необходимости повторного создания.
assertEquals(3, lexer.calculate(vars));//используются внешние параметры, передаваемые через Map. Метод calculate оценивает выражение на основе заданных параметров.
В выражениях EL строка, заключённая в одинарные кавычки (''
), считается строкой, в противном случае она рассматривается как имя переменной, метода, параметра или конкретное имя перечисления в зависимости от контекста.
jfireEL использует Map в качестве носителя параметров, где ключом является имя переменной, а значением — значение переменной.
Конкретные методы использования кода можно увидеть в следующих примерах.
jfireEL поддерживает использование []
для доступа к элементам массива, List и Map. Следующие выражения являются правильными и допустимыми.
Доступ к элементам массива
int[] array = new int[]
{
1, 2, 3, 4
};
Map < String, Object > vars = new HashMap < String, Object > ();
vars.put("array", array);
Expression lexer = Expression.parse("array[2]"); //анализ выражения EL
assertEquals(3, lexer.calculate(vars)); //выполнение выражения EL
Доступ к элементу List
List < String > list = new ArrayList < String > ();
list.add("1212");
list.add("13");
Map < String, Object > vars = new HashMap < String, Object > ();
vars.put("list", list);
Expression lexer = Expression.parse("list[1]");
assertEquals("13", lexer.calculate(vars));
Доступ к ключу и значению Map
Map < String, String > map = new HashMap < String, String > ();
map.put("1", "12");
Map < String, Object > vars = new HashMap < String, Object > ();
vars.put("map", map);
vars.put("age", "1");
Expression lexer = Expression.parse("map['1']");
assertEquals("12", lexer.calculate(vars));
Expression lexer2 = Expression.parse("map[age]");
assertEquals("12", lexer2.calculate(vars));
Арифметические операции включают сложение, вычитание, умножение и деление, а также вычисление остатка. Поддержка выглядит следующим образом:
Expression lexer = Expression.parse("1+4/2");
assertEquals(3, lexer.calculate(null)); //если не требуется вводить параметры для расчёта, можно передать null, что не повлияет на операцию
Expression lexer = Expression.parse("5-(4-1)");
assertEquals(2, lexer.calculate(null));
Expression lexer = Expression.parse("1*2-1");
assertEquals(1, lexer.calculate(null));
Доступ к свойствам объекта осуществляется с помощью .
. Если необходимо получить доступ к статическому свойству класса, можно использовать форму T(ClassName)
для получения статического класса, а затем использовать .
для доступа к соответствующему свойству. Код для обоих случаев следующий:
public class PropertyTest extends TestSupport
{
public static int age = 12;
//доступ к свойствам объекта
@Test
public void test()
{
Expression lexer = Expression.parse("home.person.age");
//home — это объект, содержащий свойство person, age — числовое свойство person
assertEquals(person.age, lexer.calculate(vars));
lexer = Expression.parse("home.person.age", Functional.build().setPropertyFetchByUnsafe(true).setRecognizeEveryTime(false).toFunction());
assertEquals(person.age, lexer.calculate(vars));
}
//доступ к статическим свойствам класса
@Test
public void test2()
{
//PropertyTest — это тестовый класс, T() указывает на полное имя класса
int result = Expression.parse("T(PropertyTest).age").calculate();
assertEquals(age, result);
}
}
Из примера доступа к свойствам объекта видно, что jfireEL поддерживает каскадные операции.
jfireEL поддерживает форму expression?value1:value2 для троичных выражений. Конкретный код выглядит следующим образом:
assertEquals(1, Expression.parse("2>1?1:2").calculate());
assertEquals(1, Expression.parse("3-2+1>1?1:2").calculate());
assertEquals(1, Expression.parse("3-2+1>1?2-1:2").calculate());
assertEquals(2, Expression.parse("3-2+1<1?2:1+1").calculate());
Map < String, Object > vars = new
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )