Мне понадобится возможность программно изменять исходный код Java, в частности применять рефакторинг. Например, перемещение метода из одного класса в другой, изменение модификатора доступа с общедоступного на частный и т. д.
Теперь в C# я бы, вероятно, выбрал абстрактное дерево синтаксиса / подход Roslyn, но я понятия не имею, с чего начать в Java.
Учитывая файл исходного кода java, как его проанализировать, чтобы можно было внести изменения, а затем сохранить в нем?
Похоже, это просто чтение файла. Я не собираюсь просто читать в java-файле и искать определенные строки (например, общедоступный метод void). Мне нужно не только прочитать файл, но, предположительно, проанализировать его в AST?




Первый: Подобные вещи (называемые рефакторинг) уже обрабатываются хорошей Java IDE (Eclipse, IntelliJ IDEA, NetBeans и другие названия). Я действительно считаю, что подобные вещи должны выполняться в среде IDE.
Второй: Если вы действительно хотите редактировать файлы программно, имейте в виду, что вы тот, кто отвечает за формат и синтаксис. Вы должны прочитать файлы, отредактировать их (вырезать, вставить или добавить код в нужную строку) и сохранить их. Ссылка, предоставленная с VedX, - хорошее начало для базового ввода-вывода. Но есть еще много чего, что нужно отслеживать.
Я сделал нечто подобное с OpenEdge ABL, и это непростая задача (вы обнаружите, что что-то пошло не так, о чем вы никогда не думали, и если вы не сделали резервную копию своего кода, он испорчен). Я сделал это, но, в конце концов, это был не лучший компромисс между временем, потраченным на то, чтобы сделать это, и реальной полезностью (мне просто понадобилось около 4 раз для примерно 1500 файлов).
Наконец (после того, как я потерял много часов, изобретая колесо рефакторинга), я написал несколько генераторов классов, которые писали совершенно новый файл каждый раз, когда мне нужно было что-то изменить - наконец, я только изменил генераторы классов (возможно, это то, о чем вы не подумали и тоже подходит). Теперь он автоматизирован, универсален и может работать параллельно (то, для чего OpenEdge не предназначен - хорошо, это дешевый взлом с моей стороны).
В третьих: Возможно, есть пакет, который вы можете использовать в своем проекте Java. Я бы попробовал погуглить. Моя первая попытка привела к следующему: http://www.methodsandtools.com/archive/archive.php?id=4 для первого понимания, что это такое и что нужно учитывать.
Я думаю, что ANTLR (antlr.org/api/JavaTool/index.html) станет решением. Я вижу, что у них есть грамматика Java, и они позволяют вам проходить AST.