Как разрешить объект Class <>, полученный из сети, в загрузчике классов по умолчанию? - PullRequest
2 голосов
/ 24 февраля 2011

Я отправляю объект Class <> по сети.

Теперь, когда я получаю объект на другой стороне, я хотел бы иметь возможность загрузить его в текущий загрузчик классов. Проблема в том, что единственный метод, который выполняет эту работу, защищен (resolveClass(Class<?> c)). Таким образом, чтобы использовать его, я должен был расширить загрузчик классов по умолчанию.

Итак, есть ли более простой способ сделать это?

Ограничения: К сожалению, я не могу записать на диск сервера, поэтому очевидное решение отправить файл .class вместо объекта неосуществимо.

1 Ответ

1 голос
/ 24 февраля 2011

Когда вы используете Class.forName (className), он разрешает класс.Вы также можете использовать ClassLoader.loadClass (classname) для конкретного загрузчика классов.

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

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

byte[] bytes = IOUtils.toByteArray(
     myClass.getClassLoader().getResourceAsInputStream(
         myClass.getName().replace('.','/')+".class"));

Примечание:чтобы загрузить класс, все его зависимости должны быть загружены первыми.Это легко, если доступны все зависимости, но усложняется, если вам нужно извлечь больше классов.

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