Как получить все суперклассы класса, используя байт-код ASM java?
Все суперклассы класса, использующие байт-код ASM java
Ответы (2)
Одним из простых способов сделать это было бы посетить байт-код конструктора класса и записать первую инструкцию вызова конструктора, то есть вызов invokespecial
, который вы можете найти. Это должно дать вам имя класса, который является super
по отношению к текущему интересующему классу.
person
vijay
schedule
05.02.2013
Привет, Виджай, спасибо за помощь. Я делаю это следующим образом. Это нормально?
- person Ramesh Subramanian; 13.02.2013
эй @RameshSubramanian ... я думаю, твое решение должно сработать. я не запускал его или что-то в этом роде, но использование ClassReader должно работать нормально. Было глупо с моей стороны не подумать об этом более простом решении. Слава вам за это.
- person vijay; 13.02.2013
Это немного сложно, так как файл класса содержит только непосредственный суперкласс. Поэтому вам придется рекурсивно читать все суперклассы.
Вы можете сделать это, обработав каждый класс с помощью ClassVisitor с переопределенным методом посещения (версия int, доступ к int, имя строки, подпись строки, суперимя строки, интерфейсы String []) для чтения имени суперкласса.
Псевдокод:
List<String> getSuperClasses(className){
superClass=getSuperClass(className)
return superClass+getSuperClasses(superClass)
}
String getSuperClass(className) {
cw=new ClassWriter()
v=new SuperClassReadingClassVisitor(cw)
new ClassReader(className).accept(v)
return v.superClass
}
class SuperClassReadingClassVisitor{
String superClass
@Override
visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
superClass=superName
super.visit(version, access, name, ...)
}
person
ruediste
schedule
06.02.2013
Привет, ruediste, большое спасибо, позвольте мне попробовать это в моей инъекции байт-кода.
- person Ramesh Subramanian; 06.02.2013
Привет, рудист, спасибо за ответ. Я делаю это следующим образом. Это нормально? или есть простой способ получить все имена суперклассов?
- person Ramesh Subramanian; 13.02.2013