Преобразование данного класса (скажем, java.lang.Object) в байтовый массив.Является ли это возможным? - PullRequest
4 голосов
/ 02 ноября 2011

Учитывая, что загрузчики классов принимают в качестве входных данных массив байтов данного класса, возвращая Class<?>, я задаюсь вопросом, возможно ли сделать обратное, то есть передать Class<?> и получить его байт массив?

Имейте в виду, что я не говорю о сериализации!

Ответы [ 4 ]

2 голосов
/ 02 ноября 2011

Вот что можно попробовать с BCEL :

JavaClass clazz = Repository.lookupClass("foo.bar.YourClass");
byte[] bytes = clazz.getBytes();

Я не знал ответа до прочтения вашего вопроса, но я знал, что должен проверить следующие библиотеки, потому что ониподдержка формат файла класса Java :

  • BCEL
  • javassist
  • asm

Если выше нене работает, поищите что-нибудь еще в этих библиотеках.

2 голосов
/ 02 ноября 2011

Вы можете использовать ClassLoader.getResourceAsInputStream (), однако не гарантируется, что это будут те же байты, что и загруженный. Я не верю, что реальные загруженные байты хранятся где-либо.

2 голосов
/ 02 ноября 2011
Реализация

A ClassLoader должна вызывать представление класса для версии спецификации языка Java, которую она поддерживает.Таким образом, он должен содержать логику для получения байтового массива и превращения его в объект Class или расширения некоторого ClassLoader, который это делает.Однако абстрактный класс ClassLoader, который определяет Java, не имеет метода, который может вернуть byte [] из класса.Возможно, что некоторые реализации имеют это (возможно, загрузчик, системный или другой загрузчик классов), но в лучшем случае это будет зависеть от реализации, а не на что-то, на что можно положиться.

Если вам требуется такая функциональностьОдин из способов сделать это - создать собственную реализацию ClassLoader и переопределить методы defineClass таким образом, чтобы входные байтовые массивы были сопоставлены с Class объектами, чтобы впоследствии их можно было извлечь.

Поскольку компилятор превращает исходный код в файлы классов (в основном, в байт []), а загрузчик классов превращает файлы классов в Class объекты, в цепочке нет ничего, что напрямую подходило бы для перехода от Class к байту [],Но с такими вещами, как переплетение байт-кода, генерация байт-кода во время выполнения и т. П., Вы можете найти что-то, что может сделать это.

2 голосов
/ 02 ноября 2011

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

Каким будет ваш вариант использования? - Передача кода в удаленное приложение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...