Главная
АИ #1 (1)
Статьи журнала АИ #1 (1)
Оптимизация процесса валидации данных в документах с использованием Java Reflect...

10.5281/zenodo.10579111

Оптимизация процесса валидации данных в документах с использованием Java Reflection и Apache Commons

Автор(-ы):

Малыхин Николай Игоревич

20 ноября 2019

Секция

Информационные технологии, телекоммуникации

Ключевые слова

Java Reflection
Apache Commons
программирование
IT
ПО
валидация
данные

Аннотация статьи

Проверка данных – ключевой этап в создании программного обеспечения. Особенно важно это в случае работы приложения с разнообразными форматами файлов, вроде JSON, XML или CSV. В таких обстоятельствах требуется эффективная и универсальная проверка данных на соответствие заданным критериям.

Java является одним из самых распространенных языков программирования для разработки приложений. Java Reflection API позволяет анализировать и управлять классами, интерфейсами, полями и методами в процессе выполнения программы. Совмещая его с библиотекой Apache Commons, например, Apache Commons Validator, Java Reflection открывает широкий спектр возможностей для оптимизации процесса проверки данных в различных типах документов.

Целью работы является рассмотрение возможностей оптимизации процесса валидации данных в документах с использованием Java Reflection и Apache Commons. При написании работы были использованы научные статьи, книги, а также мнения экспертов и проведенные ранее исследования.

Текст статьи

Введение

Процесс валидации данных в различных типах документов является краеугольным элементом разработки программного обеспечения. Эффективная и точная проверка данных на соответствие заданным критериям играет ключевую роль в обеспечении надежности и корректности работы приложений. Одним из подходов, значительно оптимизирующих этот процесс, является использование Java Reflection в сочетании с библиотекой Apache Commons.

Java Reflection API предоставляет возможность анализировать и манипулировать классами, методами и полями объектов во время выполнения программы. Комбинирование этой функциональности с возможностями Apache Commons позволяет создать гибкую и мощную систему валидации данных, улучшая производительность и снижая сложность кода.

1. Использование Java Reflection

Анализ структуры классов и их элементов в Java во время выполнения – возможность, предоставленная Java Reflection. Этот функционал дает возможность динамически получать информацию о классе, создавать его экземпляры, вызывать методы и управлять объектами в процессе работы программы.

Для осуществления проверки данных с использованием Java Reflection можно применить следующий подход:

  1. Задание модели данных: Определение модели данных, которая будет отражать информацию из документа. Например, это могут быть POJO (Plain Old Java Objects) классы, описывающие структуру данных документа.
  2. Разработка проверок через аннотации: Использование аннотаций Java для пометки полей класса, которые подлежат проверке. Создание пользовательских аннотаций, содержащих правила и условия проверки для каждого поля.
  3. Применение Reflection для проверки данных: Написание кода, использующего Java Reflection для сканирования полей объекта и проверки их соответствия установленным аннотациям.

Использование Apache Commons Validator: Apache Commons Validator предоставляет множество готовых инструментов и методов для проверки данных. В сочетании с Java Reflection, это усиливает процесс проверки данных и делает его более гибким.

Пример использования встроенных методов Apache Commons Validator включает проверку формата электронной почты, URL-адресов, чисел и других типов данных.

В целом, совместное использование Java Reflection и Apache Commons Validator предоставляет эффективные инструменты для реализации мощной системы валидации данных в различных типах документов [1].

JavaBeanUtil. Приведенный метод getFieldValue – это утилитный метод, используемый для чтения значений из поля JavaBean. Он принимает объект JavaBean и имя поля. Имя поля может быть простым (например, fieldA) или вложенным, разделенным точками (например, nestedJavaBean.nestestJavaBean.fieldA).

Концепция кэширования динамически созданных функций для улучшения производительности является важной задачей. Представленный подход имеет два пути: «быстрый» через ClassValue для кэширования и «медленный» через createAndCacheFunction, который используется при отсутствии значения в кэше.

Метод createFunctions вызывает функцию, возвращающую список функций, которые будут объединены в цепочку с помощью Function::andThen. Это объединение функций аналогично вложенным вызовам вида getNestedJavaBean().getNestJavaBean().getNestJavaBean().getFieldA(). После этого полученная функция помещается в кэш с помощью метода cacheAndGetFunction.

Для создания функции необходимо пройти по полям в указанном пути. Изложенный метод createFunctions для каждого поля fieldName и соответствующего класса вызывает метод createFunction. Этот метод ищет соответствующий геттер с использованием javaBeanClass.getDeclaredMethods(). Как только геттер найден, он преобразуется в кортеж Tuple (из библиотеки Vavr), содержащий тип, возвращаемый геттером, и динамически созданную функцию, эмулирующую поведение геттера.

В описанных выше методах упоминается константа с именем LOOKUP, которая представляет собой ссылку на MethodHandles.Lookup. С ее помощью создается прямая ссылка на метод (direct method handle) на основе ранее найденного геттера. Полученный MethodHandle передается в метод createCallSite, где для функции создается тело лямбды с использованием LambdaMetafactory. Это позволяет нам в конечном итоге получить экземпляр CallSite, который представляет собой «хранителя» функции [2].

2. Apache Commons

Apache Commons предназначен для достижения одной основной цели: создания и поддержки повторно используемых компонентов Java. Собственно, Викисклад – это место для совместной работы и обмена информацией, где разработчики из всего сообщества Apache могут совместно работать над проектами, которыми будут делиться проекты Apache и пользователи Apache.

Разработчики Commons приложат усилия к тому, чтобы их компоненты имели минимальные зависимости от других библиотек, чтобы эти компоненты можно было легко развертывать. Кроме того, компоненты Commons будут поддерживать свои интерфейсы максимально стабильными, чтобы пользователи Apache (включая другие проекты Apache) могли внедрять эти компоненты, не беспокоясь об изменениях в будущем [3].

3. Реализация основной функциональности с использованием Reflection API

Рис. 1. Интерфейс ParamValidator

Создается интерфейс ParamValidator, который содержит в себе единственный метод с входным параметром объекта для валидации. Класс AnnotationBasedParamValidatorImpl является классом реализацией интерфейса выше. Суть его работы заключается в следующем: метод получает на вход объект и далее через рефлексию проверяет каждое поле объекта на наличие аннотаций. Если нужная аннотация присутствует, то поле отправляется на валидацию. В классе присутствует Map(validationFunctions) и Set(supportedFieldAnnotations). Во множестве у нас присутствуют все доступные аннотации, а из справочника, исходя из аннотации, подбирается нужный валидатор.

4. Исследование

С целью измерения производительности методов в Java, воспользовался инструментом JMH (Java Microbenchmark Harness). Для сравнительного анализа производительности библиотек выбрал широко известную среди Java-разработчиков библиотеку Apache Commons BeanUtils, а также одну из ее альтернатив – Jodd BeanUtil, которая, как утверждается, работает с приблизительным ускорением в 20%.

В бенчмарке определено четыре сценария для разных уровней вложенности поля. Для каждого поля JMH выполнит 5 итераций по 3 секунды для разогрева, а затем 5 итераций по 1 секунде для фактического измерения. Каждый сценарий будет повторяться 3 раза для получения более качественных измерений.

Давайте начнем с результатов, собранных для JDK 8u191:

Рис. 2. Результаты Oracle JDK 8u191

Самый худший сценарий, использующий подход invokedynamic, намного быстрее, чем самый быстрый из двух других библиотек. Это огромная разница, и если вы сомневаетесь в результатах, вы можете всегда скачать 2 и поиграться с ним, как вам нравится.

Теперь посмотрим, как работает тот же тест с GraalVM EE 1.0.0-rc9.


Рис. 3. Результаты GraalVM EE 1.0.0-rc9

Разница в производительности обусловлена хорошим знанием JIT-компилятором CallSite и MethodHandle, что позволяет провести их инлайнинг (inline), в отличие от подхода с reflection. Это демонстрирует потенциал GraalVM. Компилятор этой виртуальной машины действительно впечатляет и способен существенно улучшить производительность reflection [4-6].

Заключение

Использование Java Reflection с Apache Commons становится ценным решением для оптимизации процесса валидации данных в документах. Эта комбинация предоставляет широкий спектр инструментов, позволяющих динамически анализировать структуру данных и применять проверки на основе установленных критериев валидации.

Эффективное использование Java Reflection и Apache Commons упрощает разработку программного обеспечения, обеспечивая более гибкую систему проверки данных. Оптимизация процесса валидации данных становится не только более простой, но и более эффективной благодаря сочетанию мощности Java Reflection и богатства функциональности Apache Commons.

Список литературы

  1. Полное руководство по Java Reflection API. Рефлексия на примерах. [Электронный ресурс] Режим доступа: https://javadevblog.com/polnoe-rukovodstvo-po-java-reflection-api-refleksiya-na-primerah.html. – (дата обращения 17.10.2019).
  2. Reflection API: отражение. Темная сторона Java. [Электронный ресурс] Режим доступа: https://codegym.cc/groups/posts/45-reflection-api-reflection-the-dark-side-of-java. – (дата обращения 17.10.2019).
  3. Apache Commons CLI. [Электронный ресурс] Режим доступа: https://urvanov.ru/2019/06/08/apache-commons-cli/. – (дата обращения 17.10.2019).
  4. Более быстрая альтернатива Java Reflection. [Электронный ресурс] Режим доступа: https://habr.com/ru/companies/otus/articles/455122/. – (дата обращения 17.10.2019).
  5. Apache Commons ReflectionToStringBuilder tutorial with examples. [Электронный ресурс] Режим доступа: https://www.demo2s.com/java/apache-commons-reflectiontostringbuilder-tutorial-with-examples-ssiq.html. – (дата обращения 17.10.2019).
  6. Performance testing (benchmarking) Java code with JMH. [Электронный ресурс] Режим доступа: https://www.awesome-testing.com/2019/05/performance-testing-benchmarking-java. – (дата обращения 17.10.2019).

Поделиться

Малыхин Н. И. Оптимизация процесса валидации данных в документах с использованием Java Reflection и Apache Commons // Актуальные исследования. 2019. №1 (1). URL: https://apni.ru/article/8324-optimizatsiya-protsessa-validatsii-dannikh

Другие статьи из раздела «Информационные технологии, телекоммуникации»

Все статьи выпуска
Актуальные исследования

#21 (203)

Прием материалов

18 мая - 24 мая

осталось 6 дней

Размещение PDF-версии журнала

29 мая

Размещение электронной версии статьи

сразу после оплаты

Рассылка печатных экземпляров

7 июня