воскресенье, 29 апреля 2018 г.

Кидаем исключения типа Object

Всем известно, что кидать исключения можно только, если объект наследуется от класса java.lang.Throwable. Для этого предназначена инструкция байткода ATHROW. Мне стало интересно, осуществляется ли проверка типа после компиляции.
Напишем небольшой метод, генерирующий нужный класс, с помощью библиотеки bcel.

Объявим класс ru.izebit.Test

Содержащий метод public static void main(String[] args) в котором вызывается метод test() и следом идет инструкция выхода из метода.

Добавим команды для вывода в консоль сообщения об исключении, которые будут выполняться, если оно возникнет:

Определим сигнатуру метода

И объявим в методе try-catch блок отлавливающий исключения типа java.lang.Object

Теперь напишем реализацию для метода test(). Создадим объект класса java.lang.Object и вызовем для него конструктор, следом вызовем throw и пробросим этот объект

Добавим сигнатуру для метода public static test() throw Object :

После этого, сохраним полученный класс в файл:

Содержимое файла, если его декомпилировать будет следующее:

Попробуем запустить:

Верификатор байткода не позволил выполнить код, но его всегда можно выключить добавив нужный флаг:

Как видим, программа отработала и исключение было поймано

Код целиком

суббота, 28 апреля 2018 г.

Видео с семинара по Spring

Обзор базовых компонентов фреймворка Spring:

  • Spring Boot
  • Spring Data JPA
  • Spring MVC в связке с Thymeleaf
  • Spring Security
на примере создания вебсайта

пятница, 22 декабря 2017 г.

CPU оптимизации

Сегодня, в этой небольшой статье, я хотел бы поделиться своими знаниями об оптимизациях центрального процессора. А именно:

  1. branch prediction
  2. cache levels
  3. false sharing
  4. prefetching
  5. loop unrolling

Начнем в первой. В детали вдаваться не буду, а начну сразу с примера. Допустим у нас есть следующий метод:

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

суббота, 21 октября 2017 г.

О строителях

Сегодня речь пойдет о шаблоне проектирования Builder, или же по русски, строитель.
Начнем с определения и выясним для чего он нужен.

Строитель относится к порождающим шаблонам, а значит, с его помощью создаются объекты. Он позволяет конструировать объект по частям. Приведу пример, как выглядит типичный Builder.
Допустим у нас есть класс Person

суббота, 15 июля 2017 г.

Генерирование классов во время выполнения

dynamic

Иногда требуется создать класс с определенным поведением во время работы программы. К сожалению, Java не обладает динамизмом, присущем таким языками как Python, Javascript, Groovy. Но все же, возможность такая существует, и есть несколько способов это сделать. Например, сгенерировать напрямую байткод. Но такой способ, довольно сложен. Мы же, в данной статье, напишем исходный код и затем скомпилируем его.

суббота, 17 июня 2017 г.

Создание сервиса в Linux

Иногда требуется не просто запустить программу, но и обеспечить ее работу, после перезагрузки, либо случайного падения. Можно в ручную следить за этим, но можно нужно, переложить эти заботы на откуп операционной системы. Для того чтобы сделать свою программу сервисом в Linux с использованием update-rc.d, достаточно выполнить следующее:

  • создать скрипт для управления жизненным циклом программы
  • назначить необходимые права на файл
  • зарегистрировать созданный скрипт как сервис
  • разрешить автозапуск сервиса

Как видим, шагов не так уж и много. И так начнем:

вторник, 21 марта 2017 г.

Задача о корректности расстановки скобок

Хочется рассказать о такой задаче, как определение корректности расстановки скобок. Она так же известна, как balanced parenthesis problem. Суть ее в следующем: дана строка, содержащая открывающиеся и закрывающиеся скобки, и какие то другие символы. Нужно узнать правильно ли расставлены скобки. Т.е. для каждой открывающейся скобки должна быть закрывающаяся. Например, строки вида (()) или (()()) содержат корректную расстановку, а (()() и )()( уже нет.