- Java 11+
- Gradle 7+
Баги и пожелания можете оставить на GitHub Github Issues.
Наша Телега: https://t.me/art_github
Основная серверная платформа для ART решений - JVM.
На текущий момент существует три основных подхода для автоматических (не требующих ручного кода) парсеров и генераторов данных посредством классов:
- Java Reflection
- Byte Code runtime generation
- Source code generation
Первый - медленный, непрозрачный и небезопасный.
Второй - быстрее первого, но такой же непрозрачный и небезопасный + добавляет привязку к конкретным версиям byte-code.
Третий - потребовал написания данного проекта. Но при этом является наиболее быстрым и прозрачным способом.
Разработчик пишет код:
Java:
package model;
@Getter
@AllArgsConstructor
public class MyObject {
private final String id;
}
Kotlin:
package model;
data class MyObject(val id: String)
Генератор (отдельно запущенный процесс, управляемый через Gradle рефреш или таски):
1. Анализирует код разработчика
2. Генерирует код мета-информации в один отдельный мета-класс <source-set-root>/meta/Meta<имя-модуля><язык(если используется >1 языков)>
Разработчик, который хочет работать с мета-информацией пишет код:
Java:
new <имя сгенерированного класса>().modelPackage().myObjectClass().getIdField()
Kotlin:
<имя сгенерированного класса>().modelPackage().myObjectClass().idField
Основные сценарии использования:
- Вызов конструкторов у объектов (без рефлексии или ссылок на методы, вызываются непосредственно сразу конструкторы)
- Вызов методов у объектов и статик методов у классов
- Геттеры и сеттеры у полей
- Мета-операции:
- Получить все пакеты
- Получить все классы у пакета
- Получить все поля, конструкторы, методы (+ геттеры и сеттеры для свойств у Kotlin)
- Создание Proxy классов на основе интерфейсов, позволяющих делегировать вызов метода интерфейса на объект Function
- Generics (игнорируются классы и методы с переменными типа). При этом типы с параметрами поддерживаются:
List<String>
- Kotlin Lamdba. Обработка Kotlin Function0...N реализована в проекте art-kotlin. Пока что поддерживается только Function0 и воспринимается как Supplier. В случае необходимости добавления поддержки других функций - дайте знать с указанием сценария.
- Классы, методы и конструкторы - только публичные. Поля - все области видимости.
- Классы должны быть в пакетах. Java не поддерживает импорт из default пакета во вложенные (не хочется Мета класс выносить на default уровень), а для Kotlin эту функцию специально не поддерживаем, чтобы сохранять единообразие в работе