2010-01-10 2 views
24

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

[3]: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ClassLoader.html#defineClass(java.lang.String, байт [], Int, Int)

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

+0

Смотрите также http://stackoverflow.com/questions/7980133/converting-a-given-class-lets-say-java-lang-object- to-a-byte-array-is-it-po – Bozho

ответ

23

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

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

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

+0

и как скомпилировать класс с другой стороны, когда я получаю это сообщение как 'ByteArrayInputStream'? –

+1

Создание классов из байтов - это задание классаLoader. –

+0

Привет, если класс является прокси-классом и динамическим, генерируется во время выполнения и сохраняется в памяти, как мы можем сохранить его в файл? –

2

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

1

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

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

2

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

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

Смежные вопросы