2013-04-14 4 views
0

Как найти в файле Java .class, где запустил тело методаКак получить смещение тела тела из Java .class file

Ex.

package com.test; 

class Hello 
{ 

    public static boolean isTrue() { 
     return true; 
    } 

    public static void main(String args[]) 
    { 

    } 
} 

Я хочу знать, где начать isTrue() тело метода на Hello.class

Я могу найти 04 0C (байткод: iconst_1 ireturn) с двоичный редактор с адресом 0x0205, но я хочу это значение программно для любого метода по имя.

+1

Формат файла класса описан [здесь] (http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html) – Perception

+0

Я знаю @Perception, но это требование полного парсера , Я прочитал сообщение о том, кто изменил классы ASM, но не добавил код. – user2280250

ответ

1

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

В этот момент вы также можете использовать полнофункциональный парсер классов. Там довольно много библиотек.

P.S. На уровне байт-кода методы не идентифицируются однозначно по имени, а по парам (имя, дескриптор). Несколько методов могут иметь одно и то же имя. То же самое касается полей.

+1

Протестировано с ASM и Javassist без везения. Возможно, ej jclasslib - это решение, но не может выбрать простой пример кода. – user2280250

+0

Какая часть ASM не удалась? – Antimony

+0

Протестировано на лету метод переписать с ASM. Загрузил Hello.class и изменил isTrue(), чтобы вернуть false. Но я не могу знать, где находится тело isTrue(), которое находится в файле класса. Не провалился, просто не то, что нужно. – user2280250

Смежные вопросы