Лента постов канала Java | Фишки и трюки (@java_tips_and_tricks) https://t.me/java_tips_and_tricks Примеры, уроки, статьи ✍️По всем вопросам: @Pascal4eg Купить рекламу на telega.in: https://telega.in/c/java_tips_and_tricks ru https://linkbaza.com/catalog/-1001635707605 Fri, 15 Aug 2025 13:01:17 +0300
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Thu, 14 Aug 2025 12:01:44 +0300
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Wed, 13 Aug 2025 14:01:01 +0300
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Tue, 12 Aug 2025 19:13:01 +0300
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Mon, 11 Aug 2025 12:04:02 +0300
☕️ Переменные и типы данных. Как хранить информацию в приложении.

В этом видео автор объясняет, что такое переменные и типы данных в Java.
Разбирается, как в языке хранится информация, какие бывают типы (int, double, boolean и др.) и как правильно их использовать.


🤩 Java Фишки и трюки || #Видео
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Sun, 10 Aug 2025 18:03:06 +0300
⚔️ Kubernetes v🆚 Docker Compose — что выбрать для деплоя Java-приложения

Оба запускают контейнеры.
Оба читают YAML.
Но у одного — кнопка "всё просто", а у второго — масштаб и продакшен.

🐳 Docker Compose: для dev и staging
version: '3.8'
services:
app:
build: .
ports:
- "8080:8080"
depends_on:
- db
db:
image: postgres:16

➡️ Всё в одном файле, разворачивается за 10 секунд
🟢 Подходит для локальной разработки и тестов
🟢 Никаких ingress, сервисов, namespaces
➡️ Отлично, пока всё помещается в голову

☸️ Kubernetes: для продакшена и масштабов
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-app
spec:
replicas: 2
template:
spec:
containers:
- name: java
image: myapp:1.0
ports:
- containerPort: 8080

➡️ Управление через pod'ы и deployment'ы
🟢 Поддерживает автоскейлинг, rolling updates, отказоустойчивость
➡️ Требует kubectl, ingress, сервисов, конфигов
🟢 Не подойдёт, если ты просто хочешь “запустить и посмотреть”

📡 Сеть: как доступен сервис

Compose:
ports:
- "8080:8080"

➡️ Пробрасывает порт хоста прямо в контейнер

Kubernetes:
kind: Service
spec:
type: LoadBalancer

➡️ Отдельный объект Service, управление через балансировщик

🟢 Kubernetes — это про маршрутизацию, а не про “форвард порт”

🔐 Переменные и секреты

Compose:
env_file:
- .env

➡️ Подключение переменных из файла

Kubernetes:
envFrom:
- configMapRef:
name: app-config

➡️ConfigMap и Secret — всё разделено по объектам
🟢 В K8s конфигурация живёт отдельно от кода и образа

🔁 Обновления

Compose:
docker compose down && docker compose up -d

➡️ Всё падает и поднимается заново

Kubernetes:
strategy:
type: RollingUpdate

➡️ Плавные обновления без даунтайма
🟢 K8s сам обновляет по одному поду


🗣️ Запомни: Docker Compose — это как запускать Java через main(). Kubernetes — как запускать через продакшеновый оркестр с логами, шинами и охраной.
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Fri, 08 Aug 2025 17:04:27 +0300
🐳 Docker Compose для Java: запускаем всё и сразу, в один файл

Когда у тебя Spring Boot, база, очередь и ещё 2 микросервиса — руками это не запустишь.
Docker Compose — способ задеплоить всё одним махом.
Без скриптов, без флагов, без “а где тут Redis?”. Просто up -d — и готово 👇


📦 Минимальный пример — Spring Boot + Postgres
version: '3.9'
services:
app:
build: .
ports:
- "8080:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/demo
- SPRING_DATASOURCE_USERNAME=java
- SPRING_DATASOURCE_PASSWORD=secret
depends_on:
- db

db:
image: postgres:16
environment:
- POSTGRES_DB=demo
- POSTGRES_USER=java
- POSTGRES_PASSWORD=secret

➡️ Всё в одном файле: и приложение, и база
🟢 depends_on гарантирует порядок запуска
🟢 Не нужен отдельный Postgres — он стартует сам
➡️ Ты просто клонируешь проект и запускаешь — как магия

🔄 Hot reload: монтируем код
volumes:
- .:/app

➡️ Приложение пересобирается при изменениях
🟢 Удобно для разработки, особенно с Spring DevTools
🟢 Работает как live reload, но без веб-сокетов

🧪 Добавляем ещё сервис: например, Redis
  redis:
image: redis:7
ports:
- "6379:6379"

➡️ В Java конфиге указываешь localhost:6379 — и всё
🟢 Redis появляется в сети как обычный контейнер
🟢 В Compose все сервисы в одной сети по умолчанию


🔐 .env для переменных окружения
SPRING_DATASOURCE_USERNAME=java
SPRING_DATASOURCE_PASSWORD=secret


env_file:
- .env

➡️ Хранишь секреты вне Compose-файла
🟢 Удобно для CI/CD
🟢 Никогда не коммить .env в репозиторий

🚫 Остановка и очистка
docker compose down -v

➡️ Останавливает и удаляет тома, сети, контейнеры
🟢 -v — чтобы не остался мусор от базы
🟢 Это не “stop” — это аннигиляция всего стенда

🗣️Запомни: Docker Compose — как мультиварка: закинул всё внутрь, нажал кнопку, через минуту обед.
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Wed, 06 Aug 2025 12:12:02 +0300
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Wed, 06 Aug 2025 10:12:02 +0300
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Tue, 05 Aug 2025 12:03:51 +0300
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Mon, 04 Aug 2025 18:05:19 +0300
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Sat, 02 Aug 2025 16:04:16 +0300
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Wed, 30 Jul 2025 12:04:02 +0300
🧪 Создание объекта без конструктора — это реально

В Java обычно new вызывает конструктор. Но можно создать объект, вообще не вызывая ни один конструктор. Даже private, даже если он кидает исключения.

Это работает через ☠️ Unsafe или ✔️ Objenesis.

☠️ Unsafe: объект без жизни
class User {
private User() {
throw new RuntimeException("нельзя вызывать");
}
}

Unsafe unsafe = ...;
User user = (User) unsafe.allocateInstance(User.class);

➡️ Объект создан. Конструктор не сработал.
➡️ Все поля — нули, даже final.

Ты просто получил кусок памяти под User, но без инициализации.

Objenesis: библиотека для этого
Objenesis objenesis = new ObjenesisStd();
User user = objenesis.newInstance(User.class);

➡️ Тоже создаёт объект без конструктора.
➡️ Работает на всех JVM, без хака Unsafe.
➡️ Поддерживается, используется в Spring, Mockito, Kryo.

📦 Maven-зависимость:

org.objenesis
objenesis
3.3


📛 Где это используют

Hibernate, Jackson, Kryo, Mockito — создают объекты из JSON или прокси без вызова конструктора.
Ты можешь сделать то же:
class Secret {
private final int x = 42;
private Secret() {
throw new IllegalStateException("нельзя");
}
}

Secret s = (Secret) unsafe.allocateInstance(Secret.class);
System.out.println(s.x); // 0, даже final не работает

➡️ Конструктор не вызвался, даже final сброшен.

🗣 Запомни:Ты можешь создать любой объект — даже если конструктор кидает ошибку.
Просто
Unsafe.allocateInstance(Class) или objenesis.newInstance(Class).
Но инициализировать поля придётся самому.
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Mon, 28 Jul 2025 12:04:54 +0300
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Mon, 28 Jul 2025 10:00:28 +0300
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Sun, 27 Jul 2025 17:00:47 +0300
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Thu, 24 Jul 2025 11:37:01 +0300
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Wed, 23 Jul 2025 12:03:01 +0300
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Wed, 23 Jul 2025 10:00:53 +0300
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Tue, 22 Jul 2025 19:02:27 +0300
⚡️ Static Initializer Hack в Java — выполняем код при загрузке класса

Java даёт способ выполнить код один раз, ещё до создания объекта. Это называется static initializer — и с ним можно делать настоящие фокусы 👇

🔁 Что это вообще такое

Когда JVM загружает класс — выполняются все static-блоки, даже если ты не создавал ни одного объекта.

Это можно использовать для:


🟢 регистрации классов
🟢 скрытой инициализации
🟢 запуска кода без main()
🟢 взлома "одиночек" или подмены поведения

📦 Простой пример static-блока
public class Hello {
static {
System.out.println("Загрузка Hello");
}

public static void main(String[] args) {
System.out.println("main()");
}
}


➡️ Вывод:
Загрузка Hello
main()

🟢 Сначала сработал static-блок, потом вызвался main.

💣 Выполнение кода без main()
public class RunOnce {
static {
System.out.println("Код запустился без main()");
System.exit(0); // JVM завершится
}
}

🟢 При запуске RunOnce.class — код выполнится, и main() даже не потребуется.

🧠 Применение: регистрация классов
interface Plugin {
void run();
}

class Registry {
static List plugins = new ArrayList<>();
static void register(Plugin p) {
plugins.add(p);
}
}

public class PluginA implements Plugin {
static {
Registry.register(new PluginA());
}

public void run() {
System.out.println("Плагин A запущен");
}
}


🟢 Просто загрузив PluginA, ты уже зарегистрировал его — без явного вызова конструктора или методов.

🧪 Хак с подменой поведения
class Evil {
static {
System.setSecurityManager(null); // отключаем защиту
}
}

🟢 Опасная штука — используется при обходе sandbox'а или во взломе.
Подгружаешь Evil.class, и твой код внезапно без ограничений.


💬 Хочешь пост про Unsafe, Objenesis или про bytecode-инъекции? Пиши тему — сделаем с практикой.

🗣️ Запомни:Если ты понимаешь когда и зачем срабатывает static-блок — ты уже на шаг ближе к JVM-магию ☄️
Подробнее
]]>
https://linkbaza.com/catalog/-1001635707605 Tue, 22 Jul 2025 17:00:35 +0300
Подробнее
]]>