Подтвердить что ты не робот

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

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

"bla bla bla" 

в любой другой код, например:

new MyClass("bla", 3) 

Моя фактическая мотивация - это строковое шифрование, как описано

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

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

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

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

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

4b9b3361

Ответ 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/...