- 236
- 4
- 22
Всем привет. Нужна помощь по ASM. Вообщем проблема заключается в том, что нельзя вставить код до вызова this() / super() конструктора в конструкторе, а значит нужно найти "конец" вызова этого конструктора. (Основная моя цель - вставить код в начало конструктора, тобишь после вызова this() / super()). По началу я подумал, что всё просто - нужно лишь итератором пройтись и найти самую первую инструкцию с опкодом INVOKESPECIAL и name.equlas("<init>). Но не всё так просто, как показалось.... Бывают редкие случаи с "дополнительными" вызовами методов внутри super/this инициализации конструктора. Вот к примеру:
Да, тут примеры явно не лучшие, т.к. скорее всего именно такой код нигде мы не встретим. Но создание и передачу обжекта в this/super или ретурна из статик метода - запросто. Если смотреть на такой код со стороны ASM ByteCode Viewer, то сразу идей, как задетектить конец this/super инициализации конструктора - нет. Особенно с примером, где за инициализацией идёт присвоение new обжеков в филды. Ведь хоть в инициализацию, хоть после неё - инстанции классов создаются через опкод NEW и INVOKESPECIAL <init> (а также подгрузка в стек данных для аргументов конструктора, если они есть).
Помогите, пожалуйста, придумать, как мне найти INVOKESPECIAL инструкцию, которая является "концом" вызова this() / super() в конструкторе (тобишь чтобы я мог за этой инструкцией вставлять свой код). @GloomyFolken подключаю тебя сразу к этой теме, т.к. уверен, что ты знаешь как это решить, ибо вроде как твоя либа позволяет инжектить код в начало не только методов но и конструкторов (именно то, что сейчас мне нужно)
Java:
public class TestClass {
private int d = 13;
private TestClass f;
public TestClass(String s, int i, int y) {
this(new TestClass(), s);
f = new TestClass();
}
public TestClass(String s, int i, String d) {
this(new TestClass(), new TestClass(s), testf());
f = new TestClass();
f = new TestClass(new String(d));
}
private static String testf() {
return "в";
}
public TestClass() {
}
}
Помогите, пожалуйста, придумать, как мне найти INVOKESPECIAL инструкцию, которая является "концом" вызова this() / super() в конструкторе (тобишь чтобы я мог за этой инструкцией вставлять свой код). @GloomyFolken подключаю тебя сразу к этой теме, т.к. уверен, что ты знаешь как это решить, ибо вроде как твоя либа позволяет инжектить код в начало не только методов но и конструкторов (именно то, что сейчас мне нужно)