Показаны сообщения с ярлыком java. Показать все сообщения
Показаны сообщения с ярлыком java. Показать все сообщения

воскресенье, 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. Но все же, возможность такая существует, и есть несколько способов это сделать. Например, сгенерировать напрямую байткод. Но такой способ, довольно сложен. Мы же, в данной статье, напишем исходный код и затем скомпилируем его.

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

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

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

воскресенье, 20 марта 2016 г.

JVM параметры для тонкой настройки сборщика мусора

Совсем недавно столкнулся с необходимостью уменьшения паузы "stop world" во время сборки мусора. Во время копания в данном вопросе, открыл для себя множество интересных параметров jvm. Чтобы знания не потерялись, решил зафиксировать их в табличку.

пятница, 26 февраля 2016 г.

Rest сервис на Netty

netty framework logo
Недавно познакомился с фреймворком Netty. В традиционной модели на каждое соединение создается один поток, который его обрабатывает. Это приводит к росту нагрузки на CPU и объема потребляемой памяти. Netty использует другой подход, позволяющий обрабатывать одновременно количество соединений большее, чем количество запущенных потоков. Реализован он с использованием библиотеки java.nio. В данной статье, я опишу как Netty работает и расскажу как реализовать с его помощью простой REST сервис.

среда, 10 февраля 2016 г.

Хроника будней java EE разработчика

Однажды при деплои на тестовый стенд обнаружилась такая ошибка NoSuchMethodException. Просмотр логов дал следующую информацию:


Довольно странное исключение, если учесть, что локально, все работало прекрасно. Наиболее вероятной причиной возникновения данной ошибки - разные версии библиотек. Судя по всему, в проекте оказалось несколько версий одного и того же класса. Как это решается?

понедельник, 25 января 2016 г.

Collect своими руками

После выхода java 8 появилась возможность писать в pipeline стиле. Т.е. создавать последовательность операций которые будут обрабатывать элементы из некоторого источника, будь то коллекция, бесконечная и конечная генерирующая функция, строки из файла и пр. Это тема достаточно обширная и она не будет освещена в данном топике. Расскажу про collector'ы. Это такие объекты с помощью которых, можно привести результат обработки элементов к определенному виду. Существует несколько встроенных, в классе java.util.stream.Collectors. Например, там есть toList, он создает список из элементов потока. Есть и более сложные, например, groupingBy, группирующий элементы по определенному критерию. Мы же напишем свой, который будет группировать строки по начальным буквам.

среда, 9 декабря 2015 г.

Кэширование в hibernate

На днях столкнулся с задачей кэширования запросов к БД. Приложение использовало, как это не странно, hibernate. В этой статье я расскажу, о том какие бывают кэши в hibernate, каким образом их использовать и как настраивать.

вторник, 8 декабря 2015 г.

Кое-что о ссылках в java

Сегодня поговорим о том, какие бывают ссылки в языке java.
Их всего четыре вида: Strong, Weak, Phantom и Soft.
Чтобы воспользоваться ими, за исключением первой, нужно использовать соответствующие классы из пакета java.lang.refs
Чем же они различаются и какими суперспособностями обладает каждая из них? Различия в основном связаны с поведением сборщика мусора, в тот момент когда он их обрабатывает.

суббота, 21 ноября 2015 г.

Порядок создание объектов в Java

Никогда не задумывались, как происходит инициализация объекта класса, который в свою очередь наследуется от другого класса?
Порядок довольно прост. Допустим у нас есть класс Parent и класс Child. Child является потомком Parent.
В обоих классах есть и статические и простые блоки инициализации, так присутствуют и поля.
При попытке создать объект класса Child, происходит следующее:

  1. В порядке объявления, будут проинициализированы статические блоки и статические переменные в родительском классе.
  2. То же самое произойдет в классе потомке
  3. Инициализация в порядке объявления не статических переменных и не статических блоков инициализации в классе Parent
  4. Вызов конструктора Parent
  5. Инициализация нестатических полей и блоков инициализации в классе Child в порядке объявления
  6. Вызов конструктора Child

воскресенье, 4 октября 2015 г.

Коротко о PESC

Данный прием используется для обеспечения гибкости при проектировании api с использовании generic'ов. Для дальнейшего понимания, стоит напомнить, что такое wildcard в java.
Wildcard - это ограничение для типов, которые мы определяем с помощью generic'ов. Оно может быть как сверху, так и снизу.
Ограничение снизу, определяется следующим образом Ему удовлетворяют все классы, у которых потомком является класс T.
Обозначает ограничение сверху, под него подпадают все классы наследованые от класса T.
Итак, вернемся теперь к PECS. Он гласит: producer - extends, consumer - super.
Если метод является producer, то используем ограничение сверху, если consumer, то снизу. Осталось определить, когда метод является consumer, а когда producer.
Лучше показать на примерах.

пятница, 10 июля 2015 г.

Идеальный singleton

Не буду рассказывать, что такое singleton и для чего он нужен. Расскажу про то, как его писать. Всегда склонялся к варианту double check, но после статьи про текущую модель памяти в java, мир для меня перестал быть прежним. Оказывается, volatile довольно затратная операция и немного лучше synchronized. Наилучшим же вариантом с ленивой инициализацией будет следующий код:
   public class Singleton{
      private Singleton(){};
      
      public Singleton getInstance(){
          return SingletonCreator.instance;
      }
      private static class SingletonCreator{
          public static final Singleton instance = new Singleton();
      }      
   }

воскресенье, 28 июня 2015 г.

Контракты для equals

Как известно, метод equals() определен в классе Object. Его реализация в данном классе, это простое сравнение ссылок, и если ссылки разные, то метод возвращает false. Если Вы хотите переопределить данный метод, не стоит забывать о контракте с методом hashCode(). Он гласит - если equals() возвращает true, то значение hashCode() для этих объектов будет одинаковое, но выполнение обратного необязательно.
Есть еще один контракт, о котором стоит помнить при написании своего собственного метода equals(). Все ниже перечисленные переменные не null.
  • Он должен быть рефлексивный, т.е. для любых значений x, x.equals(x) должен возвращать всегда true
  • Метод должен быть симметричен: для любых значений x и y, если x.equals(y) == true должно выполняться y.equals(x) == true
  • Должно выполняться условие транзитивности: если x.equals(y) == true и y.equals(z) == true, то x.equals(z) == true
  • Консистентность - это значит, что метод будет возвращать одно и тоже значение, независимо от того, сколько раз его вызвали, до тех пор, пока состояние объектов, для которых он вызывается, не изменено.
  • И последнее, для всех null значений метод должен возвращать false - x.equals(null) = false

Ссылка на оригинал
Пейте кофе, пишите на java ;)