Подтвердить что ты не робот

Преобразовать объект класса в байты

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

[3]: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ClassLoader.html#defineClass(java.lang.String, byte [], int, int)

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

4b9b3361

Ответ 1

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

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

Я бы, скорее всего, рекомендовал использовать что-то из Apache commons-io, чтобы прочитать InputStream в byte[], но IOUtils.toByteArray() должен сделать трюк. Написание этого кода действительно легко ошибиться и/или сделать медленным.

Ответ 2

В общем, ты не можешь так вернуться. Однако для некоторых загрузчиков классов вы можете получить файл ресурсов с полным именем класса, заменив . на / и добавив .class (поэтому mypackage.MyClass становится mypackage/MyClass.class (помните, может быть, чувствительный к регистру)).

Ответ 3

Вы можете попробовать java инструментарий! В частности, ClassFileTransformer может вас заинтересовать!!

Вы просто переопределяете метод преобразования (из ClassFileTransformer), и ваш метод преобразования вызывается перед каждым классом. Итак, вы cna делаете все байты класса.

Ответ 4

Интересный...

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