преобразовать объект класса в байты - PullRequest
24 голосов
/ 10 января 2010

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

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

РЕДАКТИРОВАТЬ: я принял ответ getResourceAsStream, потому что это очень просто и будет работать большую часть времени. ClassFileTransformer кажется более надежным решением, поскольку он не требует загрузки классов из файлов .class; он будет обрабатывать загруженные в сеть классы, например. При таком подходе есть несколько обручей, но я буду иметь в виду. Спасибо всем!

Ответы [ 5 ]

23 голосов
/ 10 января 2010

Обычно вы можете просто загрузить класс как ресурс из 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 голосов
/ 10 января 2010

Вы можете попробовать Java Instrumentation ! В частности ClassFileTransformer может быть интересен вам !!

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

2 голосов
/ 10 января 2010

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

1 голос
/ 10 января 2010

Использует ClassFileTransformer:

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

1 голос
/ 10 января 2010

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

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

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