Telegram Web Link
🖥 Глубокое погружение в Java: рефлексия и загрузчик классов. Часть 2.

Загрузчики классов
В объектно-ориентированном программировании единицей программного обеспечения является класс. Он представляет собой логическую сущность или блок. То, как классы загружаются в JVM, обычно не представляет особого интереса.

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

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

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

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

JVM
В Java используется гибридный подход к выполнению программного кода, сочетающий компиляцию и интерпретацию. Сначала класс Java определяется программистом в формате файла .java. Затем компилятор Java преобразует его в байт-код, генерируя файл .class.

Байт-код — это промежуточный язык, который понимает JVM.

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

JVM включает в себя три отдельные области:

▪️подсистему загрузчика классов (ClassLoader Subsystem);
▪️область памяти/данных времени выполнения (Runtime Memory/Data Area);
▪️механизм выполнения (Execution Engine).

Подсистема загрузчика классов— это единственный компонент JVM, который работает с файловой системой хост-устройства. Он отвечает за поиск файлов классов и их загрузку в JVM. При запросе на загрузку класса система загрузчика классов считывает байт-код его файла класса в JVM, затем конструирует эквивалентный объект Class и сохраняет байт-код его метода в куче (напомним, что классы существуют внутри JVM как объекты Class). Эти шаги показаны на следующей схеме:

📌Смотреть.
📌Часть 1.

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍134🔥3
🤖 Как с легкостью создать установщик пакетов Android

Иногда требуется установить приложение на устройство не как пользователю, а как разработчику другого приложения. Возможно, вашему приложению, будь то магазин приложений или файловый менеджер, требуется самообновление, а вы его не опубликовали на Play Store. В любом случае вы обратитесь к стандартизированным интерфейсам (API) Android SDK, обеспечивающим установку APK (Android Package Kit). Но, как известно, Android-интерфейсы часто оказываются довольно трудоемкими в использовании.

Возьмем, к примеру, установку APK. Если вы вынуждены поддерживать версии Android ниже 5.0, то для разных версий Android придется использовать разные API: PackageInstaller для версий от 5.0 или какой-нибудь Intent с действием установки.

Способ Intent.ACTION_INSTALL_PACKAGE

Intent довольно прост в использовании. Достаточно создать его, запустить Activity для получения результата и обработать возвращенный код. Вот как обрабатывается установочный intent с помощью API AndroidX Activity Result:

// регистрация лаунчера в Activity или Fragment
val installLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
val isInstallSuccessful = result.resultCode == RESULT_OK
// затем проводятся действия в зависимости от полученного результата
}

// запуск intent, например, при нажатии на кнопку
val intent = Intent().apply {
action = Intent.ACTION_INSTALL_PACKAGE
setDataAndType(apkUri, "application/vnd.android.package-archive")
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true)
putExtra(Intent.EXTRA_RETURN_RESULT, true)
}
installLauncher.launch(intent)


Не забудьте объявить разрешение на установку в AndroidManifest:

📌 Читать

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍107🔥3
📢 Вышел Kotlin 2.0.0-Beta1!

ℹ️ Этот выпуск посвящен стабилизации работы нового компилятора K2, который вскоре будет включен по умолчанию в Kotlin 2.0.

Попробуйте K2 и сообщайте о любых возможных проблемах: https://kotlinlang.org/docs/whatsnew-eap.html

@javatg
👍14🔥52👎2
🔥 Дайджест полезных материалов из мира Java за неделю

Почитать:
Spring и Hibernate простыми словами: обзор для новичков
Java-инспекции в IDEA 2023.2
IntelliJ IDEA 2023.2. Долгожданный LSP, встроенный AI-чат, апгрейд до Windows 10 и -Xmx2G
Добавление micrometer-метрик для взаимодействий по SOAP
Разработка высоконагруженного игрового WebSocket сервера на Java, Netty с поддержкой BattleRoyale/Matchmaking
Сквозь дебри разработки, или как я пытался написать приложение
Генерация контрактов OpenApi или прикладной API first: гайд по генерации в Spring Boot приложении
Эта неделя в мире Java (13 ноября)
Присматриваемся к Kafka tiered storage
How I practice TDD
What is abstract class in java and how to create abstract class in java
Try to find an open-source Spring Boot project suitable for beginners
Implementation of Stack Using Array
Mas afinal o que é esse tal de Liferay?
Design Patterns Decoded: Java Edition
Building a modern Cloud Native Full stack Microservices Project: End to End — Introduction
Logging and Exception Handling in Java
Logging and Exception Handling in Java
Add Continuous Integration(CI) for my Java project

Посмотреть:
🌐 What is a downstream collector? - Cracking the Java Coding Interview ( 01:00)
🌐 Pattern Matching for switch ( 01:45)
🌐 Java On The GPU - Inside Java Newscast #58 ( 09:17)
🌐 Why is Thread.stop() deprecated? - Cracking the Java Coding Interview ( 01:00)
🌐 Самые полезные навыки для джуна в IT — Евгений Кателла ( 00:42)
🌐 Обязательно включи эту функцию, когда впервые пишешь код — Андрей Кузьмин ( 00:38)

Хорошего дня!

@javatg
👍6🔥31
☝️Совет: Добавьте в JDBC URL свойство ApplicationName (зависит от БД, не у всех БД оно есть!).

Таким образом, в списке сессий вместо имени JDBC-драйвера будет отображаться имя приложения. Это поможет при поиске неисправностей, когда несколько приложений подключаются к одной и той же БД.

@javatg
👍446🔥5
🖥 Глубокое погружение в Java: рефлексия и загрузчик классов. Часть 3

Практический пример: добавление функциональности плагина в Java-приложение

Плагины — это небольшие программы, которые могут быть включены в работающее приложение для расширения его функциональности.
Рассмотрим редактор кода Visual Studio Code, который помогает в таких задачах разработки, как отладка, тестирование кода и контроль версий. Кроме того, он поставляется на рынок с тысячами расширений, которые могут загружать пользователи. Расширения варьируются от самых необходимых, таких как редактирование кода для определенного языка программирования, до премиальных (например, Prettier для обеспечения единого стиля кода и Better Comments, которое создает цветные комментарии к коду). Visual Studio Code предоставляет эти расширения по технологии plug-and-play.

Хотя VS code написан не на Java, идея архитектуры плагинов та же — необходимость расширения системы или подключения новой функциональности во время выполнения. Функциональность плагинов в Java-приложении реализуется с помощью рефлексии и загрузчиков классов. Создать простой плагин можно в три этапа:

1. Определение интерфейса плагина.
2. Определение загрузчика классов плагина.
3. Определение протокола для установки и запуска плагинов в системе.

На 1-м этапе должен быть определен единый интерфейс, через который приложение может запускать любой плагин.

public interface Plugin {

// возвращает имя плагина
public String getPluginName();

// запускает функциональность плагина
public void run();

// используется для настройки плагина, если это необходимо
// возвращает true/false при успешной/неудавшейся настройке
public boolean configure(Object configuration);
}

Все плагины должны иметь класс, реализующий этот интерфейс. Данный интерфейс выполняет роль маркера. При загрузке плагинов приложение рефлексивно проверяет классы в поисках класса, реализующего этот интерфейс. Он содержит метод run(), который является точкой входа для запуска плагина. В качестве альтернативы можно использовать аннотации для обозначения функции запуска плагина, аналогично примеру JUnit.

На 2-м этапе для загрузки классов плагина определяется специальный загрузчик классов. Это требуется по многим причинам.

▪️Класс однозначно идентифицируется по его имени и загрузчику классов. Загрузка плагина с помощью специального загрузчика классов создает уникальное пространство имен для классов плагина. Это предотвращает возникновение конфликтов между классами приложения и классами плагина. Например, если и приложение, и плагин определили класс с именем Foo, то JVM будет знать, как их различать, поскольку класс Foo приложения был загружен Application ClassLoader, а класс Foo плагина — специализированным загрузчиком классов, и каждый из них будет иметь свой объект Class.
▪️Не следует полностью доверять безопасность приложения коду внешнего плагина. Он может содержать непроверенный, ошибочный или вредоносный код. Наличие отдельного загрузчика классов, загружающего классы плагинов, позволяет наложить ограничения по безопасности на классы плагинов (подробнее об этом здесь).

Будет удобнее определить специальный путь для всего кода плагина. Загрузчик классов плагина будет искать файлы классов по этому пути, и его можно определить следующим образом:

Далее
Часть 2.

@javatg
👍74🔥1
🆕Java news🆕

Java выпустила новое обновление, включающее в себя Spring Framework 6.1, Spring Data 2023.1, Payara Platform, JEPs for JDK 22.

Вышел JEP 456.

JEP 456: Unnamed Variables and Patterns — расширение языка Java с безымянными переменными, которые могут быть инициализированы, но не использованы. А еще — с безымянными шаблонами, которые сопоставляются с компонентом записи, не указывая имя или тип компонента. Оба обозначаются символом подчеркивания. Эта фича уже есть в Java 21, но в качестве preview, предлагается завершить изменение.

С выходом 22 версии множество функций и дополнений перешли из фазы "Preview" в самодостаточные версии, уже доработанных функций.

Подробнее о всех обновлениях вы можете узнать тут:
ℹ️InfoQℹ️

@javatg
👍122🔥1
📣 Вышел Kotlin 1.9.21! В этом обновлении решен целый ряд проблем, включая проблемы регрессии.

Кроме того, в Kotlin 1.9.21 реализована kapt-совместимость с JDK21.

Для получения полной информации ознакомьтесь с журналом изменений здесь ⬇️.

https://github.com/JetBrains/kotlin/releases/tag/v1.9.21

@javatg
6👍2🔥1
#Java #SpringBoot Совет: Вы можете запустить метод в Spring
@Service сразу после запуска приложения, аннотировав его с помощью @EventListener (ApplicationReadyEvent.class).

Метод не может иметь параметров. Иногда я использую его для быстрого тестирования определенного метода Spring Service

@javatg
👍36🔥71👎1
#Java21 включает длинный список новых возможностей, в том числе виртуальные потоки и сильный акцент на улучшении Java для рабочих нагрузок #AI.

В этой статье рассказывается об этом.

⚡️ Читать дальше

@javatg
👍81👎1🔥1
🤖 Как создать приложение Android за 7 шагов

Создать первое Android-приложение не так сложно, как может показаться.

В этом руководстве мы поможем вам создать первое Android-приложение и запустить его на телефоне.

Android — это операционная система на базе ядра Linux, предназначенная для мобильных устройств с сенсорным экраном, таких как смартфоны, планшеты и смарт-часы.

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

Android был представлен в 2007 году вместе с основанием Open Handset Alliance (альянсом компаний по разработке открытых стандартов для мобильных устройств).

В нашей статье не будем углубляться в установку и настройку Android Studio и посчитаем что она уже установлена.

Создаем приложение Android
Шаг 1.
Дважды кликните на программу “Android Studio”.
Шаг 2. Кликните “New Project”.
Шаг 3. Выберите “Empty Activity”

📌 Далее

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍103🔥1😱1
🖥 #Java #JPA Совет: Если вы же используете генератор метамоделей в своем проекте, вы можете использовать сгенерированные классы моделей в атрибуте mappedBy ваших отношений, что обеспечит безопсность типов.

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍193🔥3🤔2😢1
SSL vs TLS - в чем разница?

SSL и TLS - это криптографические протоколы, предназначенные для обеспечения безопасного обмена данными по сети.

1️⃣Начало обмена данными

SSL и TLS: перед отправкой данных необходимо установить соединение. На этом этапе оба протокола работают одинаково.

2️⃣Сообщения ClientHello и ServerHello

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

SSL: клиент отправляет список поддерживаемых наборов шифров и другие настройки.

TLS: наряду с поддерживаемыми наборами шифров и другими настройками клиент также может отправить "ключевой ресурс" для Diffie-Hellman или Elliptic Curve Diffie-Hellman.

3️⃣Сертификат сервера

SSL и TLS: после обмена сообщениями "ClientHello" и "ServerHello" сервер отправляет клиенту свой цифровой сертификат.

4️⃣Обмен ключами

На этом этапе протоколы существенно различаются.

SSL: преимущественно использует RSA для обмена ключами.
TLS: использует другие механизмы, такие как DH и ECDH.

@javatg
👍273🔥2
🌟Вышел очередной дайджест новостей Kotlin!

Этот выпуск посвящен многим интересным событиям в мультиплатформенной экосистеме Kotlin.

➡️ https://blog.jetbrains.com/kotlin/2023/12/kotlin-news-nov-23/

🌟 Представляем Amper, новый экспериментальный инструмент для настройки проектов
🌟 Мультиплатформа Kotlin стабильна и готова к работе
🌟 Мультиплатформа Kotlin приходит в JetBrains Fleet
🌟 Вышли Kotlin 1.9.20 и 1.9.21
🌟 Руководство по Compose Multiplatform
🌟 Дорожная карта развития Kotlin Multiplatform на 2024 год
🌟 Серия вебинаров по Kotlin Multiplatform в ноябре
🌟 Code 2023 в Kotlin

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍2🔥2
👨‍💻Сложные вопросы на собеседовании для тех, кто 7 лет работал с Java. Часть 1

Java  — популярный язык программирования, активно применяемый для разработки настольных, мобильных, веб-приложений и корпоративного ПО. Семи лет в Java достаточно, чтобы разбираться в синтаксисе языка, структурах данных, концепциях программирования.

Но на собеседованиях даже опытные разработчики не справляются с каверзными вопросами, которыми проверяются их знания и навыки решения задач. Разберем некоторые их этих вопросов с подробными объяснениями и примерами.

1. Для чего и как в Java используется ключевое слово «transient»?
При сериализации объекта его состояние преобразуется в последовательность байтов, записываемой в файл или отправляемой по сети.

Ключевым словом transient в Java указывается, что значение конкретного поля класса при этом не должно включаться в сериализованную форму объекта.

Примеры использования ключевого слова transient: когда имеется поле с временным значением, которое не нужно сохранять при сериализации объекта; или поле с конфиденциальными данными, не включаемое в сериализованную форму объекта по соображениям безопасности.

public class MyClass implements Serializable {
private int myInt;
private transient String myTransientString;
// Конструктор, геттеры, сеттеры ради простоты игнорируем
// Другие методы…
}


В этом примере поле myTransientString помечено как transient: его значение не будет включено при сериализации экземпляра MyClass.

2. Чем наследование отличается от композиции? Приведите пример.
Наследование и композиция — два фундаментальных способа создания связей между классами в ООП. В обоих подходах возможны переиспользование кода и абстракция, но с разной реализацией и типами таких связей.

Вот краткое описание каждого подхода.

▪️Наследование. Это механизм, при котором новый класс, называемый подклассом или производным классом, создается наследованием свойств и характеристик — методов и полей — имеющегося класса, называемого суперклассом или базовым классом. Кроме того, методы суперкласса переопределяются подклассом в его собственной реализации. Наследованием между суперклассом и подклассом создаются отношения is-a («это»).
▪️Композиция. Это механизм, при котором в полях одного класса, называемого контейнером или целым классом, содержится минимум один экземпляр другого, называемого компонентным или составным классом. Композицией между классом-контейнером и компонентным классом создаются отношения has-a («имеет»).

📌 Читать дальше

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍244🤬2
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 Обзор архитектуры безопасности Spring Security

Ключевые компоненты:

1️⃣Менеджер аутентификации:
- Отвечает за проверку учетных данных пользователей.
- Использует различные провайдеры аутентификации (например, LDAP, JDBC).
2️⃣Контекст безопасности:
- Хранит информацию о текущем аутентифицированном пользователе.
3️⃣Провайдер аутентификации:
- Реализует фактический процесс аутентификации.
4️⃣Авторизация:
- Контролирует доступ к определенным ресурсам на основе ролей и разрешений пользователей.

🔄 Поток аутентификации:

1️⃣Цепочка фильтров:
- Каждый фильтр обрабатывает определенный аспект процесса аутентификации.
2️⃣Аутентификация по имени пользователя и паролю:
- Типичный вход в систему включает в себя фильтр UsernamePasswordAuthenticationFilter.
- Проверяет учетные данные пользователя в AuthenticationManager.
3️⃣Аутентификация на основе токенов:
- Обеспечивает аутентификацию без статических данных с помощью токенов (например, JWT).

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥62
🖥 Совет 🚀 Java API 🚀

При использовании Integer.valueOf(int) помните, что значения между -128 и 127 кэшируются для повышения производительности.

За пределами этого диапазона создаются новые объекты.

Размер кэша можно контролировать с помощью параметра -XX:AutoBoxCacheMax=<size>. 🔥

#Java #Производительность

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17👍71
🔥 Дайджест полезных материалов из мира Java за неделю

Почитать:
Немного о гигиене Java кода
Польза создания однородных задач для параллельного вычисления
Безопасность web приложений с использованием Identity Provider
Java Digest #7
8 бесплатных курсов по большим языковым моделям
Современные варианты баз данных
Деплой приложения на Java. Хостим проект через push в Git
QIWI Server Party 9.0 — 14 декабря, офлайн и онлайн
Как распараллелить тесты с базой данных
Хроники пикирующего бота или как важно не пропускать стадию QA в проектах
Генерация контрактов OpenApi или прикладной API first: совсем немного про зачем
Компоновка аннотаций в Spring
Dominando la Programación Orientada a Objetos
Try to add new feature to a Java Spring boot project
Few words about Java code hygiene
RabbitMQ Retry Strategy: Delay with Maximum Retry Threshold
Mi experiencia con GraalVM y Spring Boot
Records and data transfer
Comparing Java and JavaScript
Day when Skynet becomes self-aware, and 69 reasons to chill out with colleagues. Part 1.
How Gradle disagreed with our Maven project
What is Amortized Time Complexity Analysis

Посмотреть:
🌐 Ollama — модель уровня GPT. Используй GPT без ограничений и абсолютно бесплатно.
🌐 Another VS Code Extension For Java ? ( 07:38)
🌐 Java 22 Unpacking - Inside Java Newscast #59 ( 12:23)
🌐 What is multiple inheritance? - Cracking the Java Coding Interview ( 00:59)
🌐 What is the first thing a consructor is doing? - Cracking the Java Coding Interview #java ( 01:00)
🌐 Getting Started with Generational ZGC ( 12:49)
🌐 Looking up Default Locale in Java 21 ( 02:01)
🌐 Аналитики больше технари, чем программисты? Чья работа сложнее? ( 01:06:26)
🌐 Сильная мотивация для джунов в IT — Евгений Кот ( 00:38)
🌐 Когда нужно искать первую работу в IT — Андрей Смирнов ( 00:37)

Хорошего дня!

@javatg
👍101🔥1
🚀 Spring Совет 🚀

Кэшируемая аннотация обеспечивает быстрый доступ к данным.

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/cache/annotation/Cacheable.html

#Spring #SpringBoot

@javatg
7👍2🔥2
💡 В Mockito 5.7.0 (входит в Spring Boot 3.2) появился упрощенный способ создания захватчиков аргументов:

@javatg
👍201🔥1
2025/07/12 20:43:48
Back to Top
HTML Embed Code: