Иногда в проектах требуется скопировать атрибуты одного объекта в другой, временами не напрямую, а с некоторыми преобразованиями, например извлечением подстроки или наоборот, объединением нескольких полей родительского объекта в единое поле дочернего. Такие преобразования называются маппингами (mappings). Чаще всего они применяются там, где необходимо передать Java-объект без избыточных чувствительных данных. Об...
Continue reading...Java
Внедрение зависимостей в класс, не являющийся частью контекста Spring
Или, другими словами, как быть, если внедрить зависимость нужно, а класс собирается где-то в недрах проекта через new, то есть контекст Spring о нём даже не догадывается (а значит и никаких зависимостей в него не добавляет)? А столкнулся я с этим на текущем проекте. Есть некий клиентский API для работы...
Continue reading...java.lang.NoClassDefFoundError: Could not initialize class
Недавно я столкнулся с проблемой при отладке интеграции с одним из сторонних приложений, которое поставляется ‘as is’ и работает на IBM WebSphere. Оно использует внутренние JMS-очереди сервера для коммуникации с нашими приложениями, развернутыми там же. При миграции на новую версию сервера я столкнулся с NoClassDefFoundError, возникающей в одном из классов...
Continue reading...Многопоточность в Java
Это – перевод статьи “Threading in Java” автора Beka Kodirov. Вторая часть статьи находится здесь. Чем отличается поток от процесса? Процессы были разработаны для обеспечения многозадачности в операционных системах. Все приложения живут в рамках процессов, а память и ЦПУ выделяются напрямую ядром ОС. При желании можно запустить часть вашего приложения...
Continue reading...Как работает обработка исключений на уровне виртуальной машины Java
Источник: Java Perfomance (Hunt & John, 2011) Виртуальные машины Java используют исключения в качестве сигнала о том, что программа нарушила некие семантические ограничения языка. Например, попытка получить доступ к индексу за пределами массива вызовет ошибку. Исключение провоцирует нелокальное перемещение контроля из точки возникновения или “выброса”, в точку, которая была определена...
Continue reading...Типы опций командной строки для запуска виртуальной машины Java
Источник: Java Perfomance (Hunt & John, 2011) Существует три типа опций командной строки: стандартные, нестандартные и опции разработчиков. Стандартные опции могут использоваться в любой реализации JVM, как того требует the Java Virtual Machine Specification. Они остаются неизменными от релиза к релизу, однако могут стать deprecated в релизах, следующих за тем,...
Continue reading...Integer Cache в Java
Для оптимизации потребления памяти некоторые классы-оболочки в Java (например Integer, Byte, Short, Long и Character ) кэшируют значения в ограниченном диапазоне (чаще всего от -128 до 127). Покопавшись в исходниках JDK, можно отыскать внутренний статический класс IntegerCache: В Static-блоке инициализируется массив cache, он заполняется объектами Integer со значениями от -128...
Continue reading...Многопоточность в Java: Hardware
Это – перевод статьи “Threading in Java. Part II. Hardware” автора Beka Kodirov. Первая часть статьи находится здесь. Расскажите об иерархии кэшей L1/L2/L3? Зачем они нужны? Кэши L1/L2/L3 это сегменты памяти, в чем-то схожие с RAM. Это быстрая память небольшого объёма, которая используется для уменьшения времени доступа процессора к данным...
Continue reading...hashCode() и equals(): нарушить (,) нельзя (,) соблюдать
Второй по популярности (после различий между LinkedList и ArrayList) вопрос на собеседованиях – контракт между методами hashCode() и equals(). Метод hashCode() класса Object – нативный (то есть написан не на Java и вызывается с помощью JNI). Из сигнатуры следует, что хэш-код является некоторым целочисленным значением типа int. Полагаю, что реализация...
Continue reading...“String pool в Java” или почему не надо сравнивать строки при помощи “==”
Разбирая недавно старый код, доставшийся мне по наследству на одном из проектов, я наткнулся на дефект, который отнял у меня добрую часть рабочего дня. Ошибка была самым настоящим heisenbug’ом: несколько лет этот код успешно работал в продукционной среде и дефект вышел из тени только при миграции на новую версию одного тяжеловесного JEE-совместимого сервера приложений.
Continue reading...