Все суперклассы класса, использующие байт-код ASM java

Как получить все суперклассы класса, используя байт-код ASM java?


person Ramesh Subramanian    schedule 05.02.2013    source источник


Ответы (2)


Одним из простых способов сделать это было бы посетить байт-код конструктора класса и записать первую инструкцию вызова конструктора, то есть вызов invokespecial, который вы можете найти. Это должно дать вам имя класса, который является super по отношению к текущему интересующему классу.

person vijay    schedule 05.02.2013
comment
Привет, Виджай, спасибо за помощь. Я делаю это следующим образом. Это нормально? - person Ramesh Subramanian; 13.02.2013
comment
эй @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
comment
Привет, ruediste, большое спасибо, позвольте мне попробовать это в моей инъекции байт-кода. - person Ramesh Subramanian; 06.02.2013
comment
Привет, рудист, спасибо за ответ. Я делаю это следующим образом. Это нормально? или есть простой способ получить все имена суперклассов? - person Ramesh Subramanian; 13.02.2013