Преобразование кода Java во время компиляции
Я хотел бы преобразовать исходный код java во время компиляции непосредственно перед передачей исходного кода в компилятор. Другими словами, я хотел бы создать препроцессор , способный преобразовать
"bla bla bla"
в любой другой код, например:
new MyClass("bla", 3)
Моя фактическая мотивация - это строковое шифрование, как описано
Некоторые люди предлагают писать пользовательские обработчики аннотаций, но насколько я понимаю аннотации:
- они могут использоваться для генерации нового файла класса, но не для преобразования существующего кода перед передачей компилятору
- они, похоже, работают на уровне пакетов, классов или методов, но не в форме/реализации метода.
Некоторые люди предлагают использовать фреймворки, такие как Spoon или ObjectWeb ASM, но эти структуры кажутся сложными для изучения и развертывания на существующей базе кода.
Я стараюсь найти простой пример предварительной обработки Java-кода для обоих подходов.
Кто-нибудь видит какой-либо умный способ преобразования кода без полного изменения существующей большой базы кода с несколькими модулями плюща? Аннотации кажутся наилучшими, но я не понимаю, как это сделать.
Ответы
Ответ 1
Я думаю, вы могли бы попробовать ту же технику, что и в Project Lombok
Это примерно объяснено авторами в этом интервью:
Что происходит под капотом? I.e., как результат аннотации приводит к завершению шаблона в байт-коде?
Reinier. API-интерфейс обработчика аннотаций позволяет создавать новые файлы, но не позволяет вам изменять файл с аннотацией внутри него. Это то, что Lombok делает, поэтому Lombok не использует API-интерфейс обработчика аннотаций.
Вместо этого Lombok использует API-интерфейс обработчика аннотаций только как механизм для внедрения себя в процесс компиляции. Все обработчики аннотаций инициализируются в начале процесса компиляции, а Lombok изменяет javac, когда он инициализируется как обработчик аннотации. Мы меняем только одно: AST (исходный исходный код, разобранный в древовидную форму) сначала передается в Lombok, который генерирует все, что нужно сгенерировать, до продолжения javac.
и Как работает ломбок?
Также возможно расширить Project Lombok до ваших потребностей
Ответ 2
Есть кто-то, кто уже написал небольшой плагин C-like preprocessor ant в python/jython. Вы можете найти здесь здесь. Обратите внимание, что я никогда не использовал его, но, возможно, это может быть хорошей отправной точкой для ваших нужд.
В коде google также есть java-comment-preprocessor плагин maven (аналогичный стиль), который также может быть полезной отправной точкой.
Удачи. Звучит забавно. Конечно, имейте в виду, что обфускация просто делает его более сложным для извлечения строки, но все же не невозможно. Если вы действительно хотите сделать это значительно сложнее, вы можете захотеть зашифровать свои строки и/или использовать AOP.
Ответ 3
Если препроцессора C хватит, мне просто удалось заставить его работать с Eclipse в Windows. Это работает только на Juno.
fooobar.com/info/157148/...