Kotlin для начинающих
. Установка и настройка
1. Переменные. Базовые типы данных. Ввод/вывод
2. Арифметические операции
3. Логический тип данных
4. Оператор ветвления
5. Оператор if как выражение
6. Вложенные операторы if
7. Оператор множественного выбора
8. Операторы циклов. Цикл for
9. Цикл while
#video #kotlin
https://www.youtube.com/watch?v=4nupqVn6w38&list=PLjurg971KpKYw3H24of5vBnTsaZrYMDmL
@javatg
. Установка и настройка
1. Переменные. Базовые типы данных. Ввод/вывод
2. Арифметические операции
3. Логический тип данных
4. Оператор ветвления
5. Оператор if как выражение
6. Вложенные операторы if
7. Оператор множественного выбора
8. Операторы циклов. Цикл for
9. Цикл while
#video #kotlin
https://www.youtube.com/watch?v=4nupqVn6w38&list=PLjurg971KpKYw3H24of5vBnTsaZrYMDmL
@javatg
📢 Вышел релиз Spring Batch Notion 0.1.0-M2!
✨ Главной особенностью этого релиза является поддержка фильтрации через fluent API, которая имитирует опцию фильтрации базы данных в пользовательском интерфейсе Notion.
github.com/scordio/spring-batch-notion/releases/tag/v0.1.0-M2
@javatg
✨ Главной особенностью этого релиза является поддержка фильтрации через fluent API, которая имитирует опцию фильтрации базы данных в пользовательском интерфейсе Notion.
github.com/scordio/spring-batch-notion/releases/tag/v0.1.0-M2
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡Легкий способ получать свежие обновлении и следить за трендами в разработке на вашем языке. Находите свой стек и подписывайтесь:
Машинное обучение: www.tg-me.com/ai_machinelearning_big_data
Go: www.tg-me.com/Golang_google
Базы данных: www.tg-me.com/sqlhub
C++/ www.tg-me.com/cpluspluc
Data Science: www.tg-me.com/data_analysis_ml
Python: www.tg-me.com/pythonl
Хакинг: www.tg-me.com/linuxkalii
Devops: www.tg-me.com/devOPSitsec
C#: www.tg-me.com/csharp_ci
Java: www.tg-me.com/java_library
Linux: www.tg-me.com/+A8jY79rcyKJlYWY6
Мобильная разработка: www.tg-me.com/mobdevelop
Docker: www.tg-me.com/+0WdB4uvOwCY0Mjdi
Rust: www.tg-me.com/rust_code
Javascript: www.tg-me.com/javascriptv
React: www.tg-me.com/react_tg
PHP: www.tg-me.com/phpshka
Android: www.tg-me.com/android_its
Big Data: www.tg-me.com/bigdatai
Тестирование:https://www.tg-me.com/+F9jPLmMFqq1kNTMy
Аналитика данных: https://www.tg-me.com/+mAXY9ppJwitkMDBi
😆ИТ-Мемы: www.tg-me.com/memes_prog
🇬🇧Английский: www.tg-me.com/english_forprogrammers
📕Ит-книги бесплатно: https://www.tg-me.com/addlist/BkskQciUW_FhNjEy
ИИ: www.tg-me.com/vistehno
Книги по искусственному интеллекту
💼 Папка Go разработчика: www.tg-me.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tg-me.com/addlist/eEPya-HF6mkxMGIy
Папка ML: https://www.tg-me.com/addlist/2Ls-snqEeytkMDgy
Папка Java разработчика: https://www.tg-me.com/addlist/ZM3J6oFNAnRlNWU6
Папка с вакансиями: www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi
Машинное обучение: www.tg-me.com/ai_machinelearning_big_data
Go: www.tg-me.com/Golang_google
Базы данных: www.tg-me.com/sqlhub
C++/ www.tg-me.com/cpluspluc
Data Science: www.tg-me.com/data_analysis_ml
Python: www.tg-me.com/pythonl
Хакинг: www.tg-me.com/linuxkalii
Devops: www.tg-me.com/devOPSitsec
C#: www.tg-me.com/csharp_ci
Java: www.tg-me.com/java_library
Linux: www.tg-me.com/+A8jY79rcyKJlYWY6
Мобильная разработка: www.tg-me.com/mobdevelop
Docker: www.tg-me.com/+0WdB4uvOwCY0Mjdi
Rust: www.tg-me.com/rust_code
Javascript: www.tg-me.com/javascriptv
React: www.tg-me.com/react_tg
PHP: www.tg-me.com/phpshka
Android: www.tg-me.com/android_its
Big Data: www.tg-me.com/bigdatai
Тестирование:https://www.tg-me.com/+F9jPLmMFqq1kNTMy
Аналитика данных: https://www.tg-me.com/+mAXY9ppJwitkMDBi
😆ИТ-Мемы: www.tg-me.com/memes_prog
🇬🇧Английский: www.tg-me.com/english_forprogrammers
📕Ит-книги бесплатно: https://www.tg-me.com/addlist/BkskQciUW_FhNjEy
ИИ: www.tg-me.com/vistehno
Книги по искусственному интеллекту
💼 Папка Go разработчика: www.tg-me.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tg-me.com/addlist/eEPya-HF6mkxMGIy
Папка ML: https://www.tg-me.com/addlist/2Ls-snqEeytkMDgy
Папка Java разработчика: https://www.tg-me.com/addlist/ZM3J6oFNAnRlNWU6
Папка с вакансиями: www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi
Timefold Solver - ИИ-решатель с открытым исходным кодом для оптимизации операций и составления расписаний
👉 https://github.com/TimefoldAI/timefold-solver
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring Initializr
Initializr generates spring boot project with just what you need to start quickly!
🔥 Дайджест полезных материалов из мира Java за неделю
Почитать:
— Пишем минимальный ActivityPub-сервер с нуля
— Цикл постов про Keycloak. Часть вторая: Контроль доступа на уровне приложения
— Ускоряем запуск Spring Boot-приложений в контейнере
— Midjourney, DALL-E 3 и GPT-4 открыли мир безграничных возможностей.
— Эта неделя в мире Java (3 ноября)
— Трейсы в Spring Boot 3 с использованием Zipkin и Kafka в качестве транспорта
— Создание сервиса авторизации через систему ЕСИА
— Жук, нумерология, хеш или ничо? Оптимизация работы с путями
— На что способен КриптоПро JCP? Туториал по валидации отсоединенной электронной подписи
— Байт-код — это просто! Как сделать DI по-настоящему быстрым
— Жилье в 500м от сетевых продуктовых магазинов в Москве. Или как публикация на Лента.ру избегает Хабр и дезинформирует
— 11 Common Questions about Java and Spring Fundamentals (Part 2)
— My Intellij IDEA plugin for Maven support - GMaven
— Migrating an Springboot Java API: Part 2 - Azure Build
— Implementation of LinkedList
— Class loaders in JVM: An Overview
— Datafaker 2.0
— Step Builder Pattern to Enforce Client code to Provide data.
— Migrating an Springboot Java API: Part 1 - Docker
— Maximizando Eficiência e Tolerância a Falhas: Estratégias de Paralelismo e Divisão de Responsabilidades em Sistemas Complexos
— Dependency Inversion Principle (DIP)
Посмотреть:
🌐 Better Java Streams with Gatherers - Inside Java Newscast #57 (⏱ 08:56)
🌐 What is a race condition? - Cracking the Java Coding Interview (⏱ 01:00)
🌐 How can you check is a class is an extension of another? - Cracking the Java Coding Interview (⏱ 00:50)
🌐 Как в IT заработать больше денег? (⏱ 00:23)
Хорошего дня!
@javatg
Почитать:
— Пишем минимальный ActivityPub-сервер с нуля
— Цикл постов про Keycloak. Часть вторая: Контроль доступа на уровне приложения
— Ускоряем запуск Spring Boot-приложений в контейнере
— Midjourney, DALL-E 3 и GPT-4 открыли мир безграничных возможностей.
— Эта неделя в мире Java (3 ноября)
— Трейсы в Spring Boot 3 с использованием Zipkin и Kafka в качестве транспорта
— Создание сервиса авторизации через систему ЕСИА
— Жук, нумерология, хеш или ничо? Оптимизация работы с путями
— На что способен КриптоПро JCP? Туториал по валидации отсоединенной электронной подписи
— Байт-код — это просто! Как сделать DI по-настоящему быстрым
— Жилье в 500м от сетевых продуктовых магазинов в Москве. Или как публикация на Лента.ру избегает Хабр и дезинформирует
— 11 Common Questions about Java and Spring Fundamentals (Part 2)
— My Intellij IDEA plugin for Maven support - GMaven
— Migrating an Springboot Java API: Part 2 - Azure Build
— Implementation of LinkedList
— Class loaders in JVM: An Overview
— Datafaker 2.0
— Step Builder Pattern to Enforce Client code to Provide data.
— Migrating an Springboot Java API: Part 1 - Docker
— Maximizando Eficiência e Tolerância a Falhas: Estratégias de Paralelismo e Divisão de Responsabilidades em Sistemas Complexos
— Dependency Inversion Principle (DIP)
Посмотреть:
🌐 Better Java Streams with Gatherers - Inside Java Newscast #57 (⏱ 08:56)
🌐 What is a race condition? - Cracking the Java Coding Interview (⏱ 01:00)
🌐 How can you check is a class is an extension of another? - Cracking the Java Coding Interview (⏱ 00:50)
🌐 Как в IT заработать больше денег? (⏱ 00:23)
Хорошего дня!
@javatg
This media is not supported in your browser
VIEW IN TELEGRAM
Вот простая и структурированная дорожная карта Java разработчика с роликами youtube.
1. Основы Java
- Core Java
2. JDBC основы
JDBC
3. SQL
- SQL
4. JSP + Servlet
5.1. Core Spring Framework
5.2. Spring REST & Spring DATA
5.3. Spring Security
6. Hibernate Framework
7. Spring Boot
8. Basic DevOps
8.1. Learn to Use AWS & Deploy Java Apps
8.2. Learn Basic Docker:
8.3. Learn Basic Kubernetes:
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Глубокое погружение в Java: рефлексия и загрузчик классов.
Парадигмы программирования можно сравнить с территориями. На каждой территории, от императивного до декларативного программирования, установлены строгие законы поведения, диктующие, что можно делать, а что нельзя.
Но чаще всего разработчики оказываются на территории, где приходится осуществлять то, что не одобряется или запрещается. В таких случаях начинается поиск лазеек и способов применения системы для решения насущных задач. Иногда обнаруживаются законы, которые разрешают действия, противоречащие основным принципам системы.
В этой статье я покажу, как две уникальные особенности Java позволяют создать полезные антишаблоны на территории Java.
Территория ООП
Объектно-ориентированное программирование (ООП) является одной из наиболее распространенных моделей программирования.
Рефлексия в Java
Пожалуй, самой популярной особенностью Java является то, что это статически типизированный язык.
📌 Читать статью
@javatg
Парадигмы программирования можно сравнить с территориями. На каждой территории, от императивного до декларативного программирования, установлены строгие законы поведения, диктующие, что можно делать, а что нельзя.
Но чаще всего разработчики оказываются на территории, где приходится осуществлять то, что не одобряется или запрещается. В таких случаях начинается поиск лазеек и способов применения системы для решения насущных задач. Иногда обнаруживаются законы, которые разрешают действия, противоречащие основным принципам системы.
В этой статье я покажу, как две уникальные особенности 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
Почитать:
— Введение в 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
В этой статье вы узнаете, как с помощью 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
Загрузчики классов
В объектно-ориентированном программировании единицей программного обеспечения является класс. Он представляет собой логическую сущность или блок. То, как классы загружаются в JVM, обычно не представляет особого интереса.
Классы просто всегда оказываются под рукой, когда они нужны, и это весьма удобно.
Однако изучение внутренних механизмов загрузки классов в Java полезно, поскольку внутренняя система загрузки классов в JVM фактически доступна для программистов, которые могут вмешиваться в процесс загрузки классов и изменять поведение JVM в случае необходимости.
Это имеет целый ряд преимуществ и практических применений. Одним из них является контроль над тем, какие именно файлы классов загружаются в JVM, что позволяет предотвратить проблемы и конфликты, связанные с загрузкой зависимостей.
Другим преимуществом загрузчиков классов является то, что они позволяют вносить новое поведение в выполняющуюся программу путем динамической загрузки новых классов. Это является основой для создания архитектур плагинов и расширяемых программ на Java. Прежде чем погрузиться во внутреннее устройство системы загрузки классов в Java, необходимо понять модель выполнения Java.
JVM
В Java используется гибридный подход к выполнению программного кода, сочетающий компиляцию и интерпретацию. Сначала класс Java определяется программистом в формате файла .java. Затем компилятор Java преобразует его в байт-код, генерируя файл .class.
Байт-код — это промежуточный язык, который понимает JVM.
Java-программы выполняются с помощью виртуальной машины Java (JVM). Идея виртуальной машины Java заключается в том, что она действует как абстрактный виртуальный компьютер, который создает изолированную среду для выполнения Java-программ. Работающая JVM практически не знает о своем хост-компьютере и определяет строгий протокол загрузки программных файлов из файловой системы компьютера для выполнения.
JVM включает в себя три отдельные области:
Подсистема загрузчика классов — это единственный компонент JVM, который работает с файловой системой хост-устройства. Он отвечает за поиск файлов классов и их загрузку в JVM. При запросе на загрузку класса система загрузчика классов считывает байт-код его файла класса в JVM, затем конструирует эквивалентный объект Class и сохраняет байт-код его метода в куче (напомним, что классы существуют внутри JVM как объекты Class). Эти шаги показаны на следующей схеме:
📌Смотреть.
📌Часть 1.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Иногда требуется установить приложение на устройство не как пользователю, а как разработчику другого приложения. Возможно, вашему приложению, будь то магазин приложений или файловый менеджер, требуется самообновление, а вы его не опубликовали на 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
ℹ️ Этот выпуск посвящен стабилизации работы нового компилятора 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
Почитать:
— 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
Таким образом, в списке сессий вместо имени 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-м этапе должен быть определен единый интерфейс, через который приложение может запускать любой плагин.
На 2-м этапе для загрузки классов плагина определяется специальный загрузчик классов. Это требуется по многим причинам.
▪️Класс однозначно идентифицируется по его имени и загрузчику классов. Загрузка плагина с помощью специального загрузчика классов создает уникальное пространство имен для классов плагина. Это предотвращает возникновение конфликтов между классами приложения и классами плагина. Например, если и приложение, и плагин определили класс с именем Foo, то JVM будет знать, как их различать, поскольку класс Foo приложения был загружен Application ClassLoader, а класс Foo плагина — специализированным загрузчиком классов, и каждый из них будет иметь свой объект Class.
▪️Не следует полностью доверять безопасность приложения коду внешнего плагина. Он может содержать непроверенный, ошибочный или вредоносный код. Наличие отдельного загрузчика классов, загружающего классы плагинов, позволяет наложить ограничения по безопасности на классы плагинов (подробнее об этом здесь).
Будет удобнее определить специальный путь для всего кода плагина. Загрузчик классов плагина будет искать файлы классов по этому пути, и его можно определить следующим образом:
Далее
Часть 2.
@javatg
Практический пример: добавление функциональности плагина в 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