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

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

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

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

Территория ООП
Объектно-ориентированное программирование (ООП) является одной из наиболее распространенных моделей программирования.

Рефлексия в Java
Пожалуй, самой популярной особенностью Java является то, что это статически типизированный язык.

📌 Читать статью

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

Почитать:
Введение в Apache Flink: осваиваем фреймворк на реальных примерах
Решение задач Yandex Cup 2023 на Java, часть 2
Решение задач Yandex Cup 2023 на Java
Helidon 4 вышел, а никто и не заметил
Гайд по авторизации в Micronaut
Java Digest #6
Пишем минимальный ActivityPub-сервер с нуля
Цикл постов про Keycloak. Часть вторая: Контроль доступа на уровне приложения
Ускоряем запуск Spring Boot-приложений в контейнере
Эта неделя в мире Java (3 ноября)
Migrating an Springboot Java API: Part 3 - AWS ElasticBeanstalk
Why Kotlin is a Prime Choice for Your Project
Adding testing for my java project
SOLIDify Your Foundation: Mastering Software Design with a Deep Dive into SOLID Principles
Cost Savings Strategies for Backend Developers on AWS with Java Code Optimization
[Digest] Java, Kotlin, Spring, Cloud, and More - Episode 15
What is Interface In java and what are the example of java interface in java
MongoDB Aggregation Pipeline Stages: Using addFields stage with Java
Announcing AppMap for GitHub - Runtime Code Reviews for Every Pull Request
A Simple Way to Check if a Word is Palindrome in Java

Посмотреть:
🌐 How can you check is a class is an extension of another? - Cracking the Java Coding Interview ( 00:50)
🌐 Better Java Streams with Gatherers - Inside Java Newscast #57 ( 08:56)
🌐 What is a race condition? - Cracking the Java Coding Interview ( 01:00)
🌐 What is the type ? super T? - Cracking the Java Coding Interview ( 00:58)
🌐 Record Patterns in Java 21 ( 01:23)
🌐 Optimizing your equals() methods with Pattern Matching - JEP Cafe #21 ( 32:56)
🌐 What does static mean? - Cracking the Java Coding Interview ( 01:00)
🌐 Как в IT заработать больше денег? ( 00:23)
🌐 У кого в IT нет проблем с деньгами? — Фил Ранжин ( 00:14)
🌐 Как стать Android-разработчиком и куда расти потом — Евгений Кателла — Как мы попали в IT ( 01:02:25)
🌐 Путь в IT android-разработчика — Евгений Кателла ( 00:31)

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

@javatg
🖥 Slim Docker Images for Java

В этой статье вы узнаете, как с помощью Alpine Linux и инструмента jlink создавать Docker-образы для своих Java-приложений.

Мы будем использовать последние базовые образы Java 21, предоставленные Eclipse Temurin и BellSoft Liberica.

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

В качестве примера мы возьмем простое приложение Spring Boot, открывающее несколько эндпоинтов REST.

https://piotrminkowski.com/2023/11/07/slim-docker-images-for-java/

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Структуры данных и алгоритмы

1. Поиск. Теоретическое описание.
2. Линейный поиск. Реализация на Python и Java.
3. Интерполяционный поиск. Реализация на Python и Java.
4. Позиционная система счисления.
5. Вычисление остатка от деления. Реализация в Python и Java.
6. Арифметические операции. Реализация в языках программирования Java и Python.
7. Бинарный поиск. Реализация на Python и Java.
8. Наибольший общий делитель. Реализация на Python и Java.
9. Сортировка. Теоретическое описание.
10. Сортировка выбором. Реализация на Python и Java.

#video #algorithm

https://www.youtube.com/watch?v=aWy0-bGZk3U&list=PLtNPgSbW9TX7acrQa2LeBAMGxO5WRAVsz

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Глубокое погружение в 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
🤖 Как с легкостью создать установщик пакетов 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
📢 Вышел Kotlin 2.0.0-Beta1!

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

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

@javatg
🔥 Дайджест полезных материалов из мира 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
☝️Совет: Добавьте в JDBC URL свойство ApplicationName (зависит от БД, не у всех БД оно есть!).

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

@javatg
🖥 Глубокое погружение в 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
🆕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
📣 Вышел Kotlin 1.9.21! В этом обновлении решен целый ряд проблем, включая проблемы регрессии.

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

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

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

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

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

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

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

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

@javatg
🤖 Как создать приложение 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
🖥 #Java #JPA Совет: Если вы же используете генератор метамоделей в своем проекте, вы можете использовать сгенерированные классы моделей в атрибуте mappedBy ваших отношений, что обеспечит безопсность типов.

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
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
🌟Вышел очередной дайджест новостей 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
👨‍💻Сложные вопросы на собеседовании для тех, кто 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
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
2024/11/17 10:46:30
Back to Top
HTML Embed Code: