2012-05-07 3 views
25

Я хотел бы преобразовать java исходный код во время компиляции перед передачей исходного кода в компилятор. Другими словами, я хотел бы создать препроцессор способен превратитьПреобразование кода Java во время компиляции

"bla bla bla" 

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

new MyClass("bla", 3) 

Моя текущая мотивация сделать шифрование строки, так как explained here

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

  • они могут использоваться для генерации нового файла класса, но не для преобразования существующего кода перед передачей его компилятору
  • они, похоже, работают на уровне пакета, класса или метода, но не являются темой/реализацией метода.

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

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

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

+0

[Jet] (http://www.eclipse.org/articles/Article-JET/jet_tutorial1.html) может быть полезным (я не знаю, в каком состоянии он находится, но работал хорошо некоторые много лет назад). JavaCC придерживается того же подхода. – home

+3

Вы можете написать собственный плагин Ant/Mavin, который сначала выполнит шифрование, а затем скомпилирует ваш код. – Pushkar

+0

У меня такой же вопрос. Можете ли вы поделиться тем, что у вас получилось? – rahulmohan

ответ

1

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

В коде google также есть maven плагин (аналогичный стиль), который также может быть полезной отправной точкой.

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

9

Я думаю, вы могли бы попробовать тот же метод, используемый в Project Lombok

Это примерно объясняется авторами в this interview:

Что происходит под капотом? I.e., как результат аннотации приводит к завершению шаблона в байтекоде?

Reinier: Аннотация процессор API только позволяет создавать новые файлы, это не позволит вам изменить файл, который имеет аннотацию внутри него. Это то, что делает Lombok, поэтому Lombok не использует API-интерфейс обработчика аннотаций.

Вместо этого Lombok использует API-интерфейс обработчика аннотаций только как механизм для внедрения себя в процесс компиляции. Все обработчики аннотаций инициализируются в начале процесса компиляции, а Lombok изменяет javac, когда он инициализируется как обработчик аннотации. Мы меняем только одно: AST (исходный исходный код, разобранный в древовидную форму) сначала передается в Lombok, который генерирует все, что нужно сгенерировать, до того, как javac продолжит.

и How does lombok work?

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

0

Если препроцессор будет достаточно, я просто удается заставить его работать с Eclipse в Windows. Однако это работает только на Juno.

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

Смежные вопросы