Перейти к основному содержанию

Обзор

ActiveJ Codegen - это эффективный генератор Java-кода с оптимизированным и простым API. Он построен на базе ObjectWeb ASM и имеет нулевую накладную производительность. ActiveJ Codegen широко используется на сайте ActiveJ Serializer, что делает его самым быстрым сериализатором на базе JVM в мире. ActiveJ Codegen является одной из технологий ActiveJ, но имеет минимум сторонних зависимостей и может использоваться как самостоятельный компонент.

Почему ActiveJ Codegen?#

  • Использует мощную библиотеку ASM для генерации и манипулирования кодом
  • Предоставляет лаконичный API Expressions, который обеспечивает Lisp-подобный DSL для описания новых классов
  • Поддерживает кэширование сгенерированных классов
  • Подходит для динамического создания классов на основе параметров времени выполнения (например, обработка запросов)
  • Поддерживает операции реляционной алгебры для отдельных элементов: агрегатные функции, предикаты, упорядочивание, группировка по и т.д.
  • Особенности автоматического вывода типов
  • Производительность с нулевыми накладными расходами
  • Поддержка записей (гетерогенные контейнеры данных)

Генерация кода#

Допустим, мы хотим создать класс, реализующий интерфейс Person .

public interface Greeter {    void sayHello();}

Созданный класс должен просто выводить "Hello World" при вызове метода sayHello() .

public class WorldGreeter implements Greeter {    @Override    public void sayHello() {        System.out.println("Hello World");    }}

Чтобы сгенерировать такой класс программно, мы должны использовать ClassBuilder class для определения того, как должен быть создан класс. И нам нужно использовать DefiningClassLoader чтобы определить новый класс.

DefiningClassLoader classLoader = DefiningClassLoader.create();
Class<Greeter> greeterClass = ClassBuilder.create(Greeter.class)        .withMethod("sayHello",                call(staticField(System.class, "out"), "println", value("Hello world")))        .defineClass(classLoader);

Обратите внимание на выражение call(staticField(System.class, "out"), "println", value("Hello world")) .

Вот как выглядит Expressions DSL. Сначала мы обращаемся к статическому полю out класса System . Затем мы вызываем на нем метод println() , передавая в качестве аргумента значение "Hello world" . Это эквивалентно System.out.println("Hello world").

Когда создается новый экземпляр этого класса и вызывается метод sayHello() , на выходе получается "Hello world" , как и ожидалось.

Greeter greeter = greeterClass.getDeclaredConstructor().newInstance();greeter.sayHello(); // печатает "Hello world" в stdout

Это лишь намек на то, на что способен ActiveJ Codegen. Для получения дополнительной информации обратитесь к примерам или внутренней документации.

Добавьте ActiveJ Codegen в свой проект#

Вы можете добавить ActiveJ Codegen в свой проект, импортировав его репозиторий Maven. Эта документация охватывает последний выпуск ActiveJ Codegen v5.0-beta2 (см. на сайте Github или Maven).