Разное

Модуль в джава: Общие сведения о модулях Java

Содержание

Модуль 1. Урок 1. Введение в Java.

Для перемещения по курсу нужно зарегистрироваться

1. Модуль 1. Урок 1. Введение в Java. ↳ теория

2. Модуль 1. Урок 2. Виды языков программирования и место языка Java среди них. ↳ теория / тесты

3. Модуль 1. Урок 3. Из чего состоит Java. ↳ теория / тесты

4. Модуль 1. Урок 4. Основы работы в терминале (ознакомительный). ↳ теория / тесты

5. Модуль 1. Урок 5. Настройка окружающей среды для разработки на языке Java. ↳ теория / тесты

6. Модуль 2. Урок 1. Введение в ООП. ↳ теория / тесты

7. Модуль 2. Урок 2. Типы данных в Java. ↳ теория / тесты

8. Модуль 2. Урок 3. Работа с экземплярами в Java. ↳ теория / тесты

9. Модуль 2. Урок 4. Пакеты в Java. ↳ теория / тесты

10. Модуль 3. Урок 1. Основы использования и создания методов в классах. ↳ теория / тесты

11. Модуль 3. Урок 2. Аргументы и результаты работы методов. Рефакторинг. ↳ теория / тесты

12. Модуль 3. Урок 3. Уровни методов в Java.

↳ теория / тесты

13. Модуль 3. Урок 4. Наследование в Java. ↳ теория / тесты

14. Модуль 3. Урок 5. Аннотация @Override в Java. ↳ теория / тесты

15. Модуль 4. Урок 1. Условный оператор IF в Java. ↳ теория / тесты

16. Модуль 4. Урок 2. Массивы в Java. ↳ теория / тесты

17. Модуль 4. Урок 3. Циклы в Java. ↳ теория / тесты

18. Модуль 4. Урок 4. Оператор SWITCH в Java. ↳ теория / тесты

19. Модуль 5. Урок 1. Уровни доступа в Java. ↳ теория / тесты

20. Модуль 5. Урок 2. Конструкторы в Java. ↳ теория / тесты

21. Модуль 5. Урок 3. Неизменяемые объекты. ↳ теория / тесты

22. Модуль 5. Урок 4. Паттерн проектирования Builder. ↳ теория / тесты

23. Модуль 5. Урок 5. Перечисления в Java. ↳ теория / тесты

24. Модуль 6. Урок 1. Составные строки в Java. ↳ теория / тесты

25. Модуль 6. Урок 2. Манипуляции c символами. ↳ теория / тесты

26. Модуль 6. Урок 3. Преобразование строк в числа и обратно. ↳ теория / тесты

27. Модуль 7. Урок 1. Интерфейсы в Java. ↳ теория / тесты

28. Модуль 7. Урок 2. Абстрактные классы. ↳ теория / тесты

29. Модуль 7. Урок 3. Интерфейс List в Java. ↳ теория / тесты

30. Модуль 8. Урок 1. Nested (static) классы в Java. ↳ теория / тесты

31. Модуль 8. Урок 2. Inner (non-static) классы в Java. ↳ теория / тесты

32. Модуль 8. Урок 3. Анонимные классы в Java. ↳ теория / тесты

33. Модуль 9. Урок 1. Исключения в Java. ↳ теория / тесты

34. Модуль 9. Урок 2. Иерархия исключений. ↳ теория / тесты

35. Модуль 10. Урок 1. Проект ХО. ↳ теория

36. Модуль 10. Урок 2. Проект ХО. ↳ теория

37. Модуль 10. Урок 3. Проект ХО. ↳ теория

38. Модуль 10. Урок 4. Проект ХО. ↳ теория

Порой обучение продвигается с трудом. Сложная теория, непонятные задания… Хочется бросить. Не сдавайтесь, все сложности можно преодолеть. Рассказываем, как

Не понятна формулировка, нашли опечатку?

Выделите текст, нажмите ctrl + enter и опишите проблему, затем отправьте нам. В течение нескольких дней мы улучшим формулировку или исправим опечатку

Что-то не получается в уроке?

Загляните в раздел «Обсуждение»:

  1. Изучите вопросы, которые задавали по уроку другие студенты — возможно, ответ на ваш уже есть
  2. Если вопросы остались, задайте свой. Расскажите, что непонятно или сложно, дайте ссылку на ваше решение. Обратите внимание — команда поддержки не отвечает на вопросы по коду, но поможет разобраться с заданием или выводом тестов
  3. Мы отвечаем на сообщения в течение 2-3 дней. К «Обсуждениям» могут подключаться и другие студенты. Возможно, получится решить вопрос быстрее!

Подробнее о том, как задавать вопросы по уроку

Обзор модулей Spring для Java

Рассказывает Мария Багулина

Spring для Java — обширная платформа для создания веб-проектов на Java, состоящая из множества независимых модулей (проектов) для разных задач: от простых веб-приложений до Big Data. Мы рассмотрим, что дают эти модули, какие их основные особенности и для чего их можно использовать.

Что такое Spring?

Spring возник в 2003 году в виде облегчённого аналога платформы для корпоративных приложений Java Enterprise. Он позиционируется как простая в использовании платформа для веб-приложений. Spring поддерживает несколько языков JVM: Java, Kotlin и Groovy.

Spring состоит из большого числа модулей. Среди них есть модули-стартеры, без которых Spring-приложение просто не запустится, а есть также вспомогательные проекты, добавляющие в приложение определённую функциональность: например Spring Data Flow для потоковой обработки данных, Security для безопасности или Cloud для распределённых систем. Такая структура позволяет разработчикам эффективно создавать и поддерживать приложения, используя только нужные инструменты.

Остановимся более подробно на основных модулях Spring и узнаем, для чего их можно использовать.

Несколько слов о Spring Framework

Spring Framework — ядро платформы Spring. Framework неявно используется другими компонентами Spring, например MVC и WebFlux, обеспечивая фундаментальные инструменты для различных архитектур приложений.

Мы не будем рассматривать его как отдельный модуль Spring, но перечислим основные характеристики и особенности.

Spring Framework включает:

  • Основные технологии: внедрение зависимостей, события, ресурсы, i18n, проверка, связывание данных, преобразование типов, SpEL, AOP.
  • Инструменты тестирования: mock-объекты, TestContext, Spring MVC Test, WebTestClient.
  • Доступ к данным: транзакции, поддержка DAO, JDBC, ORM, Marshalling XML.
  • Интеграцию: удалённое взаимодействие, JMS, JCA, JMX, электронная почта, задачи, планирование, кеш.

Spring Boot

Spring Boot — комплексный фреймворк для создания и запуска приложений с минимальными усилиями и настройками. Этот модуль делится на два стека: основанный на API сервлетов Spring MVC и реактивный Spring WebFlux.

Spring WebFlux — веб-платформа, созданная, чтобы по максимуму использовать преимущества современных многоядерных процессоров и обрабатывать огромное количество одновременных подключений.

Spring MVC построен на API сервлетов и использует архитектуру синхронного блокирующего ввода-вывода с моделью «один запрос на поток».

В Spring Boot также можно опционально подключить библиотеку Reactor для создания реактивных систем на JVM.

Характеристики

  • Встраивание контейнеров Tomcat, Jetty или Undertow напрямую без развёртывания WAR-файлов.
  • Готовые стартовые зависимости, упрощающие конфигурацию сборки.
  • Возможность сконфигурировать проект прямо в браузере с помощью Spring Initializr.
  • Автоматическая настройка сторонних библиотек (по возможности).
  • Готовые к работе функции, такие как сбор метрик, проверка работоспособности и использование внешней конфигурации.
  • Нет кодогенерации и не требуется конфигурация XML — всё конфигурируется через аннотации.

Для чего используется

Вместе со Spring Boot в проектах обычно используются Spring Security и Cloud. С помощью Spring Boot можно создавать:

  • микросервисы;
  • реактивные системы;
  • веб-приложения.

Что почитать и с чего начать

Для скоростного погружения в Spring Boot пройдитесь по руководству по быстрому запуску. Также в официальной документации можно найти гайд по созданию приложения с помощью Spring Boot и туториал для написания веб-службы RESTful.

Spring Data

Модуль обеспечивает приложениям доступ к данным через реляционные и нереляционные базы данных (БД), map-reduce фреймворки и облачные сервисы. Spring Data содержит множество подпроектов, предназначенных для определённых СУБД. Среди них есть, например, MySQL, MongoDB, Redis и многие другие. Также можно использовать подмодули, разработанные сообществом Spring для более специфичных баз данных вроде ArangoDB, Google Datastore, Microsoft Azure Cosmos DB и других.

Основной механизм, реализуемый в Spring Data — репозиторий. Это набор интерфейсов, использующих JPA Entity для взаимодействия с данными.

Характеристики

  • Настраиваемое отображение сущностей в БД на Java-объекты.
  • Создание динамических запросов в базу данных через сигнатуру метода интерфейса репозитория.
  • Базовые классы для различных задач.
  • Прозрачный аудит объектов.
  • Возможность интегрировать собственный код репозитория.
  • Простая интеграция со Spring через JavaConfig, а также кастомных пространств имён XML.
  • Расширенная интеграция с контроллерами Spring MVC.

Для чего используется

Spring Data используется везде, где нужен доступ к данным, и легко интегрируется с другими модулями Spring.

Что почитать и с чего начать

Обо всех модулях Spring Data можно почитать в официальной документации.

Spring Cloud

Со Spring Cloud вы сможете легко и быстро создавать шаблоны в распределённых системах. Из примеров таких шаблонов: управление конфигурацией, обнаружение сервисов, интеллектуальная маршрутизация, микропрокси, одноразовые токены и многое другое.

Шаблоны, созданные с помощью Spring Cloud, будут хорошо работать в любой распределённой среде, включая ваш собственный ноутбук, центры обработки данных и PaaS-платформы, такие как Cloud Foundry.

Spring Cloud также состоит из множества подпроектов для разных целей. Так, Spring Cloud Azure интегрирует Spring со службами Azure, Spring Cloud Stream используется для создания управляемых событиями микросервисов (event-driven microservices) и так далее.

Характеристики

  • Распределённая / версионная конфигурация.
  • Регистрация и обнаружение сервисов.
  • Маршрутизация.
  • Связь между сервисами (service-to-service calls).
  • Балансировка нагрузки.
  • Выбор лидера и состояние кластера.
  • Распределённый обмен сообщениями.

Для чего используется

Spring Cloud содержит много полезных инструментов для микросервисов и распределённых систем.

Что почитать и с чего начать

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

Spring Cloud Data Flow

Spring Cloud Data Flow нужен приложениям, в которых используется потоковая передача и пакетная обработка данных.

Фреймворк поддерживает ряд готовых кейсов обработки данных, среди которых ETL, потоковая обработка событий и прогнозная аналитика.

Характеристики

  • Развёртывание приложений на платформах Cloud Foundry и Kubernetes.
  • Готовые приложения для различных сценариев интеграции и обработки данных.
  • Настраиваемые приложения, ориентированные на связующее ПО или службы данных.
  • Простой потоковый конвейер DSL, чтобы указывать, какие приложения развёртывать и как подключать выходы и входы.
  • Графический редактор для интерактивного построения конвейеров данных и мониторинга метрик с помощью Wavefront, Prometheus, Influx DB или других систем.
  • REST API для создания и развёртывания конвейеров данных с возможностью работы из командной строки.

Для чего используется

Spring Cloud Data Flow подойдёт для создания конвейеров потоковой обработки данных — например, чтобы пересылать какие-либо данные в базу и затем удобно анализировать их.

Что почитать и с чего начать

Попробуйте создать микросайт с помощью Spring Cloud Data Flow и ознакомиться с примерами использования.

Spring Security

Spring Security — среда аутентификации, авторизации и контроля доступа. Это стандартный фреймворк, который используется для защиты приложений на основе Spring.

Spring Security предоставляет базовые функции безопасности, которые можно легко расширить для ваших собственных нужд.

Характеристики

  • Аутентификация и авторизация пользователей.
  • Защита от атак, таких как фиксация сессии, кликджекинг, подделка межсайтовых запросов и так далее.
  • Возможность интеграции с Servlet API.
  • Опционально подключаемый модуль Spring Web MVC.

Для чего используется

Модуль Security нужен, чтобы обеспечить проверку безопасности и защитить приложение от атак.

Что почитать и с чего начать

На официальном сайте есть небольшое руководство по защите веб-приложения, более подробный гайд с объяснением всех функций и особенностей Spring Security, а также раздел в документации.

Spring Integration

Spring Integration позволяет облегчить обмен сообщениями в приложениях на основе Spring, поддерживает интеграцию с внешними системами и даёт инструменты для обработки данных из разных источников. Один из подпроектов Spring Cloud, Spring Cloud Stream, использует Spring Integration как движок для микросервисов, управляемых событиями.

Характеристики

  • Много шаблонов для интеграции приложений предприятия.
  • Интеграция с внешними системами.
  • Веб-сервисы (SOAP и REST).
  • Обширная поддержка JMX.
  • MBeans-компоненты.

Для чего используется

Spring Integration подключается к проекту, если вам нужно связать POJO (Plain Old Java Object) с помощью парадигмы обмена сообщениями без внедрения зависимостей (DI). Также Integration позволяет взаимодействовать с внешними системами с помощью адаптеров каналов и шлюзов. Адаптеры каналов используются для односторонней интеграции (отправка или получение), а шлюзы — для сценариев запроса / ответа (входящего или исходящего).

Что почитать и с чего начать

Посмотрите небольшое руководство по созданию приложения, использующего Spring Integration для извлечения данных, их обработки и записи в файл. Также можете изучить более 50 примеров.

Spring Batch

Spring Batch — платформа для разработки пакетных приложений. Spring Batch подойдёт как для простых, так и для более сложных проектов — платформа легко масштабируется и может обрабатывать большие объёмы информации.

Характеристики

  • Управление транзакциями.
  • Обработка на основе фрагментов данных.
  • Декларативный ввод / вывод.
  • Веб-интерфейс администрирования (Spring Cloud Data Flow).

Для чего используется

Spring Batch подойдёт для приложений с многократно используемыми функциями, чтобы обрабатывать большие объёмы записей. Среди таких функций — ведение логов и трассировка, управление транзакциями, статистика обработки заданий, перезапуск и пропуск заданий, управление ресурсами и другие.

Что почитать и с чего начать

Гайд по созданию базовой пакетной службы и более 20 примеров использования Spring Batch.

…И ещё немного

Мы перечислили лишь ключевые модули Spring. На самом деле их гораздо больше: например, есть ещё Spring for Android для создания Android-приложений, Spring CredHub для взаимодействия с CredHub-сервером, Spring LDAP и многие другие.

С полным списком проектов Spring можно ознакомиться на официальном сайте.

 

Модули Java 9 — руководство по их пониманию

Содержание

Система модулей платформы Java

В Java 9 появилась новая функция, известная как система модулей платформы Java (JPMS) или модули Java. Он был добавлен для сбора пакетов Java и кодирования их в единое целое, называемое модулем.

В более ранних версиях Java не существовало концепции модулей, что затрудняло управление всеми приложениями. Для этого в Java 9 JDK был реструктурирован в набор различных модулей, чтобы разработчики могли получить доступ только к необходимому для проекта модулю, а не ко всему JDK. Помимо JDK, Java теперь также позволяет разработчикам создавать модули для разработки приложений на основе модулей.

В этой статье мы обсудим, что такое модули Java и как их использовать.

Что такое модуль Java?

Это механизм упаковки, который позволяет разработчикам упаковывать приложение Java или API в отдельные модули Java. Он упакован в виде модульного файла JAR, в котором разработчики также могут указать, какие из пакетов Java внутри модуля должны быть видны другим модулям Java.

Зачем вам использовать модули Java?

Использование модулей Java дает Java-разработчикам различные преимущества. Ниже приведены некоторые из основных преимуществ, благодаря которым модули Java отлично подходят для создания приложений. Это позволяет разработчикам указать, какие модули потребуются приложению. С помощью этой информации Java может упаковать ваше приложение, включая только необходимые модули API Java.

До появления JPMS вам приходилось упаковывать все API вместе с вашим приложением. Неиспользуемые API часто делали приложение излишне большим и сложным для распространения.

2. Лучшая инкапсуляция внутренних пакетов

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

3. Обнаружение отсутствующих классов при запуске

Начиная с Java 9 и более поздних версий, приложения Java теперь также упаковываются в модули Java. Следовательно, каждый модуль приложения должен указывать, какие модули Java API ему требуются.

Чтобы убедиться, что все модули отсутствуют, JVM теперь проверяет полный граф зависимостей модулей при запуске. Если требуемые модули не найдены, JVM сообщает об отсутствующих модулях Java и завершает работу.

До Java 9 было невозможно обнаружить отсутствующие классы, пока само приложение не попытается использовать их во время выполнения. К тому времени приложение рухнет, если нужный класс не будет найден.

Модули Java: основы

После обсуждения того, что такое модули Java и их преимущества, давайте рассмотрим некоторые основы модулей в Java.

1. Количество пакетов

Модули Java часто содержат один или несколько пакетов Java, принадлежащих одному и тому же приложению. Модуль может быть полным приложением Java, API платформы Java или сторонним API.

2. Именование модулей Java

Модуль Java должен иметь уникальное имя. Он следует тем же соглашениям об именах, что и пакеты Java, но не должен содержать символы подчеркивания, Java хочет использовать подчеркивание в качестве зарезервированного идентификатора в будущем, поэтому избегайте их использования даже в пакетах и ​​классах.

Например, вот допустимое имя модуля

 com.shaharyar.module01 

3. Дескриптор модуля

Для модулей в Java требуется дескриптор модуля Java с именем module-info. java. Он должен находиться в корневом каталоге модуля. Дескриптор модуля указывает, какие пакеты необходимо экспортировать и какие другие пакеты требуются модулю.

Пустой дескриптор модуля Java будет выглядеть следующим образом:

 module com.shaharyar.module01 {…} 

Сначала идет ключевое слово модуля, за которым следует имя модуля, и, наконец, набор фигурных скобок, в которых будут указаны экспортируемые пакеты и требуемые модули.

4. Экспорт модулей

Как упоминалось ранее, пакеты, которые требуются для других модулей, должны быть указаны явно. Экспортируемые пакеты объявляются в дескрипторе модуля.

Так пишется экспортная декларация внутри дескриптора модуля:

 module com.shaharyar.module01 {
 экспортирует com.shaharyar.module01;
} 

Приведенный выше код экспортирует пакет с именем com.shaharyar.module01.

Разработчики также могут экспортировать подпакет, но он также должен быть явно объявлен в дескрипторе модуля:

 module com. shaharyar.module01 {
 экспортирует com.shaharyar.module01;
 экспортирует com.shaharyar.module01.util;
} 

Вы также можете самостоятельно экспортировать подпакет без его родительского пакета.

Если мы изменим приведенный выше пример, чтобы просто экспортировать подпакет, это будет сделано так:

 модуль com.shaharyar.module01 {
 экспортирует com.shaharyar.module01.util;
} 

5. Модуль требует

В отличие от экспорта, если модуль Java требуется модулю для выполнения задачи, требуемый модуль Java должен быть указан в дескрипторе модуля аналогично модулям экспорта:

 модуль com.shaharyar. модуль01 {
 требует javafx.graphics;
} 

Типы модулей в Java 9

В Java 9 есть четыре типа модулей,

1. Платформенные модули

Набор модулей Java 9, который содержит части модифицированной модульной структуры JDK, называется модулями платформы.

2. Модули приложений

Эти модули создаются, когда разработчики создают приложение из модулей. Различные функции добавляются в виде модулей в приложении. Все сторонние зависимости также относятся к этой категории.

3. Автоматические модули

Те файлы jar, которые размещены по пути к модулю без дескрипторов модулей, являются автоматическими модулями. Несколько ранее существовавших библиотек еще не были модульными. Их можно использовать в модульном приложении как автоматические модули.

4. Безымянные модули

Когда класс или файл JAR помещается в путь к классам, но не в путь к модулю, он автоматически считается безымянным модулем. Поскольку у него нет имени, он может читать и экспортировать все модули. Он в основном используется для обеспечения обратной совместимости с ранее написанным кодом.

Ограничения в модулях Java 9

1. Отсутствие циклических зависимостей

Граф зависимостей модуля всегда должен быть ациклическим графом, что означает, что циклические зависимости между модулями не разрешены в Java 9. Например, если для модуля M1 требуется модуль M2, то для модуля M2 не может требоваться задний модуль M1.

2. Разделенные пакеты не допускаются

Наличие двух модулей, экспортирующих один и тот же пакет, называется разделенным пакетом. Разделенный пакет означает, что все содержимое пакета будет разделено между несколькими модулями. Это может произойти, если несколько модулей пытаются одновременно экспортировать один и тот же пакет. Это ограничено в Java 9, и если попытаться, JVM будет жаловаться при запуске.

Как скомпилировать модуль в Java 9

Чтобы скомпилировать модули Java 9, вам нужно использовать команду javac, которая входит в состав Java SDK. У вас должна быть команда javac из установки JDK, чтобы она работала правильно.

Вот как вы можете скомпилировать модуль:

 javac -d out --module-source-path src/main/java --module com.shaharyar.module01 

вы также можете заменить приведенный выше код javac с полным путем, где находится команда javac, например:

 "C:\Program Files\Java\jdk-9. 0.4\bin\javac" -d out --module-source-path
src/main/java --module com.shaharyar.module01 

Здесь javac используется для компиляции модуля. Он записывает скомпилированный результат в место, указанное после аргумента -d. –module-source-path указывает на исходный корневой каталог (а не на корневой каталог модуля). Исходный корневой каталог обычно находится на один уровень выше корневого каталога модуля.

Наконец, аргумент –module указывает, какой модуль Java должен быть скомпилирован. В приведенном выше примере это модуль com.shaharyar.module01. Вы также можете использовать ту же команду, чтобы указать более одного модуля для компиляции, написав их имена через запятую. См. этот пример:

 ... --module com.shaharyar.module01, com.shaharyar.module02 

Как запустить модуль в Java 9

Теперь мы готовы запустить основной класс модуля Java.

Для этого вам нужно использовать команду java, например:

 java --module-path out --module com. shaharyar.module01/
com.shaharyar.module01.Main 

Аналогично компиляции модуля, аргумент –module-path указывает на корневой каталог, в котором находятся все скомпилированные модули.

Аргумент –module указывает, какой модуль и основной класс нужно запустить. В приведенном выше фрагменте кода имя модуля — com.shaharyar.module01, а имя основного класса — com.shaharyar.module01.Main. Оба они разделены косой чертой (/).

Заключение

Модули в Java 9 — сложное дополнение. Если вам интересно узнать больше о модулях Java 9, загляните в другие наши блоги!

См. также: Модульность в Java: что это такое?

Отражающий доступ с открытыми модулями и открытыми упаковками

Главная > Учебники > Модули > Рефлективный доступ с открытыми модулями и открытыми пакетами

Введение в модули в Java

Отражающий доступ с открытыми модулями и открытыми упаковками

Дополнительные зависимости с требуют статического

Предыдущие в серии: Введение в модули в Java

Следующий в серии: Необязательные зависимости с требуют статического

Строгая инкапсуляция модульной системы также применима к отражению, которое утратило свою «суперсилу» для взлома внутренних API. Конечно, отражение является важной частью экосистемы Java, поэтому система модулей имеет специальные директивы, поддерживающие отражение. Он позволяет открывать пакеты, что делает их недоступными во время компиляции, но допускает глубокое отражение во время выполнения и открытие целых модулей.

Примечание : Вам необходимо знать основы модульной системы, чтобы извлечь максимальную пользу из этой статьи.

Почему экспорт пакетов не подходит для отражения

Основным механизмом предоставления доступа к типам за пределами модуля является экспорт пакета, содержащего их, с помощью директивы exports в объявлении модуля. Это не подходит для отражения по двум причинам:

  1. Экспорт пакета делает его частью общедоступного API модуля. Это побуждает другие модули использовать содержащиеся в нем типы и обеспечивает определенную степень стабильности. Это часто не подходит для классов, обрабатывающих HTTP-запросы или взаимодействующих с базой данных.
  2. Более техническая проблема заключается в том, что даже в экспортированных пакетах доступны только общедоступные члены общедоступных типов. Но фреймворки, которые полагаются на отражение, часто обращаются к закрытым типам, конструкторам, аксессорам или полям, что все равно не работает.

Открытые пакеты (и модули) разработаны специально для решения этих двух задач.

Открытие пакетов для отражения

Модуль может открыть пакет для отражения, добавив открывает директива для объявления модуля:

 модуль com.example.app {
    открывает com.example.entities;
}
 

Во время компиляции пакет полностью инкапсулирован, как если бы директивы не было. Это означает, что код вне модуля com.example.app , который использует типы из пакета com.example.entities , не будет компилироваться.

С другой стороны, во время выполнения типы пакетов доступны для отражения. Это означает, что отражение может свободно взаимодействовать со всеми типами и членами — публичными или нет (используя AccessibleObject. setAccessible() как обычно для закрытых членов).

Как вы, вероятно, заметили, открывает , был разработан специально для использования в случае отражения и ведет себя совершенно иначе, чем экспортирует :

  • разрешает доступ ко всем членам, таким образом, не влияя на ваши решения относительно видимости
  • предотвращает компиляцию кода в открытых пакетах и ​​разрешает доступ только во время выполнения
  • сообщает о намерении использовать пакет с инфраструктурой на основе отражения

В случае необходимости пакет можно экспортировать и открыть.

Открытие модулей

Если у вас есть большой модуль со многими пакетами, которые необходимо подвергнуть отражению, вам может показаться утомительным открывать каждый из них по отдельности. Хотя нет подстановочного знака, такого как , открывается com.example.* , что-то близкое к нему существует. Поместив ключевое слово open перед модулем в объявлении модуля, создается открытый модуль :

 открыть модуль com.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *