Предположим, что я хочу добавить незначительный синтаксический сахар к Java. Просто небольшие вещи как добавление regex литералы шаблона, или возможно основывают 2 литерала или многострочные строки, и т.д. Ничего серьезного грамматически (по крайней мере на данный момент).
Как можно было бы пойти о выполнении этого?
Я должен расширить компилятор байт-кода? (Который возможен?)
Я могу записать плагины Eclipse, чтобы сделать, простой исходный код преобразовывает прежде, чем подать его к стандартному компилятору Java?
Чарльз Наттер, технический руководитель JRuby, расширил Javac с помощью буквальных регулярных выражений. Пришлось поменять примерно 3 строчки корпуса, насколько я помню.
См. http://twitter.com/headius/status/1319031705
А вот отличное руководство о том, как добавить новый оператор в javac, http: //www.ahristov. com / tutorial / java-compiler.html
Дополнительные ссылки можно найти в моем списке ссылок для хакеров javac .
Я бы взглянул на Project Lombok и попытался повторить их попытку. Они используют аннотации Java 5 для подключения Java-агента, который может манипулировать абстрактным синтаксическим деревом до компиляции кода. В настоящее время они работают над созданием API, позволяющего писать пользовательские трансформаторы, которые можно использовать с javac или основными IDE, такими как Eclipse и NetBeans. Помимо аннотаций, которые вызывают генерацию кода, они также планируют добавить изменения синтаксиса (возможно, синтаксис mixin или синтаксис замыкания до Java 7).
(возможно, я немного исказил некоторые детали, но я думаю, что я довольно близок).
Lombok имеет открытый исходный код, поэтому изучение их кода и попытка построить на его основе, вероятно, будет хорошим началом.
Если это не удастся, вы можете попытаться изменить компилятор javac. Хотя из того, что я слышал, это, вероятно, будет упражнением по вытягиванию волос в разочаровании для любого, кто не является экспертом по компиляторам и Java.
Вы можете взломать javac
с помощью JSR 269 (подключаемая обработка аннотаций). Вы можете подключиться к посетителю, который просматривает операторы в исходном коде, и преобразовать его.
Вот, например, ядро преобразования, чтобы добавить поддержку римского числа в java (прочитайте, конечно, полный post для получения более подробной информации). Это кажется относительно простым.
public class Transform extends TreeTranslator {
@Override
public void visitIdent(JCIdent tree) {
String name = tree.getName().toString();
if (isRoman(name)) {
result = make.Literal(numberize(name));
result.pos = tree.pos;
} else {
super.visitIdent(tree);
}
}
}
Вот дополнительные ресурсы:
Я не знаю, использует ли проект Lombok (цитируемый в другом ответе) ту же технику, но я думаю, что да.
Чарльз Наттер, технический руководитель JRuby, расширил Javac с помощью буквальных регулярных выражений. Пришлось поменять примерно 3 строчки корпуса, насколько я помню.