Определение суперкласса класса, когда класс находится в форме байтового массива? - PullRequest
3 голосов
/ 12 января 2012

У меня есть массив байтов, представляющих байты файла класса.

Я пытаюсь получить суперкласс класса, представленного байтовым массивом. В настоящее время я использую отражение метода "defineClass" класса ClassLoader для создания определения класса, представленного байтовым массивом. Затем я получаю суперкласс, вызывая getSuperclass () для вновь созданного объекта Class.

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

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

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

Есть ли способ получить суперкласс класса, когда класс находится в форме массива байтов? Основываясь на формате файла .class, я предположил бы, что мог бы каким-то образом «случайно» определить суперкласс, не определяя класс как объект класса и не загружая его в JVM, но я не совсем уверен, с чего бы я начал это делать.

Есть предложения?

Ответы [ 2 ]

3 голосов
/ 12 января 2012

Простой, но не очень эффективный во время выполнения: определите класс в новом загрузчике классов, определите супертип, сделайте ваши преобразования и определите класс в загрузчике классов по вашему выбору.(классы, загружаемые разными загрузчиками классов, считаются разными во время выполнения).

Более эффективно: используйте некоторую библиотеку, способную проверять файлы классов, например Javassist ( Tutorial ),или напишите код извлечения самостоятельно (проверьте спецификацию файла класса ).

1 голос
/ 12 января 2012

Я использовал Objectweb ASM , который не является одним из самых простых в использовании API, но, возможно, самым быстрым.

...