Генерация кода Java: Как изменить существующий метод файла Java - PullRequest
4 голосов
/ 10 февраля 2010

У меня есть файл .java src, который выглядит так:

class Test {

    public void foo() {
    }

}

Я бы хотел программно изменить foo (), скажем, добавить sysout и сделать так:

public void foo() {
    System.out.println("hello world");
}

Есть ли какие-либо известные способы сделать это, НЕ напрямую редактируя файл src (RandomAccessFile)?

Несколько сообщений о StackOverflow ссылаются на CodeModel и AST Eclipse JDT для генерации кода. Я вижу, что это поможет сгенерировать код с нуля, а не изменить существующий код. Есть ли API, который позволил бы вам модифицировать существующий код и который имеет такой простой API, как AST CodeModel / Eclipse JDT? Если нет, то как лучше всего это сделать?

Ответы [ 5 ]

2 голосов
/ 10 февраля 2010

Вы можете использовать некоторую библиотеку манипулирования байт-кодом, например, JavaAssist. See section 4.2 Изменение тела метода в руководстве для javaassist: http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial2.html

0 голосов
/ 17 июня 2013

Если вы пытаетесь редактировать исходный код, а не байт-код, вы можете использовать класс ASTRewrite библиотеки AST Eclipse JDT для изменения существующего файла исходного кода Java. Вы можете оштрафовать документацию здесь .. ASTRewrite

Некоторые образцы вы можете найти здесь .. Использование ASTRewrite

0 голосов
/ 11 июля 2011

Если вы настаиваете на работе с генерацией кода, вы можете создать класс-заглушку для класса Test, а затем класс Test расширяет класс-заглушку. Как это


class Test extends TestStub {<br/>
  @Override<br/>
  public void foo() {<br/>
    super.foo();<br/>
  }<br/>
}<br/>
// Generated stub class<br/>
class TestStub {<br/>
  public void foo() {<br/>
    System.out.println("hello world");<br/>
  }<br/>
}

0 голосов
/ 14 февраля 2010

Если вы хотите изменить файл исходного кода, вам нужна система преобразования программ. DMS Software Reengineering Toolkit - это инструмент преобразования программ, который будет читать исходный код, создавать структуры данных компилятора (AST, таблицы символов, потоковые графы), которые позволяют вам применять перезаписи от источника к источнику к коду, представленному в виде этих структур, используя исходные шаблоны для сопоставления / замены, а затем восстанавливать действительный источник из результата. 1003 *

В DMS есть парсер / prettyprinters для многих языков, включая Java, C, C ++, C #, COBOL, PHP, JavaScript, ...

0 голосов
/ 10 февраля 2010

Вы можете добиться генерации кода, используя шаблоны JET или писать собственные процессоры аннотаций. Примечание: с другой стороны, Aspect-ориентированные платформы реализуют это, используя концепцию, называемую как переплетение кода, когда определены точечные срезы.

...