Вопрос по java – Преобразование кода Java во время компиляции

25

я бы хотелtransform исходный код Javaat compile time непосредственно перед передачей исходного кода компилятору. Другими словами, я хотел бы создатьpreprocessor способен преобразовать

<code>"bla bla bla" 
</code>

в любой другой код, такой как:

<code>new MyClass("bla", 3) 
</code>

Моя настоящая мотивация - это шифрование строк, так какобъяснил здесь

Некоторые люди предлагают писать собственные процессоры аннотаций, но, насколько я понимаю, аннотации:

they can be used to generate new class file, but not to transform existing code before being passed to compiler they seem to work at package, class or method level, but not method body/implementation.

Некоторые люди предлагают использовать фреймворки, такие как Spoon или ObjectsWeb ASM, но эти фреймворки кажутся сложными для изучения и развертывания на базе существующего кода.

Я стремлюсь найти простой пример предварительной обработки Java-кода для обоих подходов.

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

Вы можете написать собственный плагин Ant / Mavin, который сначала выполняет шифрование, а затем компилирует ваш код. Pushkar
У меня такой же вопрос. Можете ли вы поделиться тем, что вы получили в итоге? rahulmohan
Jet  может быть полезным (я не знаю, в каком она состоянии, но несколько лет назад хорошо сработало). JavaCC придерживается того же подхода. home

Ваш Ответ

3   ответа
9

Проект Ломбок

Это приблизительно объяснено авторами вэто интервью:

What's going on under the hood? I.e., how does an annotation result in the boilerplate ending up in the bytecode?

Reinier: The annotation processor API only lets you create new files, it does not let you modify the file that has the annotation inside of it. Which is what Lombok does, so Lombok does not use the annotation processor API.

Instead, Lombok uses the annotation processor API only as a mechanism to inject itself into the compilation process. All annotation processors are initialized early in the compilation process, and Lombok modifies javac when it is initialized as an annotation processor. We change only one thing: The AST (the raw source code, parsed into a tree form) is first handed off to Lombok, which generates whatever needs to be generated, before javac continues.

И вКак работает ломбок?

Также возможно расширить Project Lombok в соответствии с вашими потребностями.

Custom AST transformations with Project Lombok Project Lombok: Creating Custom Transformations
2

кто уже написал небольшой C-подобный плагин муравья препроцессора в python / jython. Вы можете найти этоВот, Обратите внимание, что я никогда не использовал его, но, возможно, это может стать хорошей отправной точкой для ваших нужд.

Также естьJava-комментарий-препроцессор плагин maven (похожий стиль) в коде Google, который также может быть полезной отправной точкой.

Удачи. Звучит как забавный вызов. Конечно, имейте в виду, что запутывание просто усложняет извлечение строки, но все же не является невозможным. Если вы действительно хотите сделать это значительно сложнее, то вы можете посмотреть на шифрование ваших строк и / или использование AOP.

0

мне просто удалось заставить его работать с Eclipse в Windows. Это работает только на Юноне, хотя.

https://stackoverflow.com/a/10497206/1137626

Похожие вопросы