преобразуйте Объект класса в байты

Если у меня есть Экземпляр класса во времени выполнения, я могу получить его байт [] представление? Байты, которыми я интересуюсь, были бы в формате файла Класса, таком, что они будут допустимым входом к [ClassLoader.defineClass][3].

[3]: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ClassLoader.html#defineClass (java.lang. Строка, байт [], интервал, интервал)

Править: Я принял ответ getResourceAsStream, потому что это очень просто и будет работать большую часть времени. ClassFileTransformer походит на большее надежное решение, потому что он не требует, чтобы классы были загружены из .class файлов; это обработало бы загруженные сетью классы, например. Существует несколько обручей для перехода через с тем подходом, но я удержу в памяти. Спасибо все!

24
задан Brian Harris 10 January 2010 в 16:27
поделиться

5 ответов

121 --- 1302225-

Вы обычно можете просто загрузить класс в качестве ресурса от классы.

Class c = ...
String className = c.getName();
String classAsPath = className.replace('.', '/') + ".class";
InputStream stream = c.getClassLoader().getResourceAsStream(classAsPath);

Я бы, вероятно, рекомендовал использовать что-то из Apache Commons-io, чтобы прочитать входную поток в байт [] , но IOUTILS.TOBYTEARRAY () должен сделать трюк. Написание того, что код действительно легко ошибочно и / или сделать медленно.

23
ответ дан 29 November 2019 в 00:06
поделиться

В целом вы не можете вернуться так. Однако для некоторых классовых погрузчиков вы можете получить файл ресурсов, чтобы получить полностью квалифицированное имя класса, замена . С / / и добавлением .Class (так MyPackage.myclass становится MyPackage / myclass.class (запомнить, может быть случай чувствительный)).

2
ответ дан 29 November 2019 в 00:06
поделиться

Вы можете попробовать Java . ! В частности, ClassFileTrensformer Может быть, интерес для вас !!

Вы просто переопределяете метод преобразования (из класса CILLETRANSFORMER), и ваш метод преобразования будет вызываться, прежде чем каждый класс загружен. Итак, вы, CNA, делаете любые байты класса.

2
ответ дан 29 November 2019 в 00:06
поделиться

Использует использование классовфильтрансформатора:

http://www.sixlegs.com/blog/java/definalizer.html

1
ответ дан 29 November 2019 в 00:06
поделиться

Интересно...

Может ли загрузка «.class» в виде файла дать необходимые входные данные? Другими словами, я считаю, что вам нужен файл, который был скомпилирован с помощью javac или другого компилятора.

1
ответ дан 29 November 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: