Как изменить методы в файле .class без перекомпиляции - PullRequest
0 голосов
/ 04 марта 2011

Мне нужно изменить существующий скомпилированный .class файл. На самом деле у меня есть даже источники этого, но я не могу просто изменить и перекомпилировать его из-за многих зависимостей, которых у меня нет.

Так что мне нужно изменить 2 метода. Оба имеют тип возврата void . Первая содержит всего 2 строки, которые являются вызовами других методов того же класса, т.е.

public void a() {
    System.out.println("a");
}

public void b() {
    System.out.println("b");
}

public void ca() {
    a();
    b();

}

И мне нужно изменить метод ca sp, чтобы он вызывал только метод ().

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

Как я могу это сделать?

Ответы [ 9 ]

4 голосов
/ 04 марта 2011

Если у вас нет необходимых зависимостей, как вы собираетесь использовать этот код?Я настоятельно рекомендую вам посвятить свое время нормальной компиляции, вместо того, чтобы просто менять двоичный файл.В долгосрочной перспективе это, вероятно, будет лучшей ставкой.

1 голос
/ 04 марта 2011

Попробуйте этот вопрос в редакторах Java Bytecode.

редактор байт-кода Java?

Однако я думаю, что ответ Джона Скита действительно применим здесь.

1 голос
/ 04 марта 2011

Я бы взглянул на AspectJ и установил триггеры на каждый вызов ca. Тогда вы можете легко заблокировать этот вызов и вместо этого вызвать.

0 голосов
/ 08 марта 2013

Вы можете использовать декомпилятор Java для открытия файла класса, его редактирования и сохранения.

Вот одна хорошая декомпозиция -> http://java.decompiler.free.fr/

0 голосов
/ 05 марта 2011

У меня была похожая проблема.

Мне пришлось изменить метод в файле класса без источника. Метод плохо выбрасывал исключения, поэтому пришлось его подправить. Я декомпилировал класс с помощью Classfile Analyzer (http://classfileanalyzer.javaseiten.de/) Затем я отредактировал полученный файл и перекомпилировал его с помощью ассемблера Jasmine.

Используя Apache BCEL, вы можете выполнить то же самое, но более элегантно - во время выполнения - не так, как я описал выше во время компиляции.

0 голосов
/ 04 марта 2011

Вы можете использовать библиотеку Javaasist для изменения существующего файла класса.

0 голосов
/ 04 марта 2011

Вы пробовали смотреть в отражение?У меня ограниченный опыт с этим, но я не уверен, что вы хотите сделать это возможным.

0 голосов
/ 04 марта 2011

Если метод a общедоступен, то самый простой способ - использовать аспект ( Аспектно-ориентированное программирование , AspectJ ) и перехватывать каждый вызов ca. Вместо вызова ca просто вызовите a.

0 голосов
/ 04 марта 2011

Я не уверен, что вы можете изменить это в первую очередь, но даже если у вас все получилось, я бы не советовал. Более чистым решением было бы расширить ваш класс и переопределить реализацию метода ca() для вызова только метода a().

...