Я написал некоторый байт-код через ASM (сгенерированный класс реализует некоторый известный интерфейс).
У меня также есть некоторые зависимости от других классов.
Теперь я хочу подключить массив байтов к некоторому классу.
Как я могу загрузить класс из массива байтов?
Прямо сейчас я получаю NoClassDefFoundError: IllegalName: core/selecter/ObjectSelector/codegen/testClass.class
Я использую этот код для загрузки класса:
@SuppressWarnings("unchecked")
private static <T> SelectorAccess<T> createNewOrNull(byte[] bytesOfClass, String name) {
try {
return (SelectorAccess<T>) new ClassLoader() {
public Class<?> defineClass(byte[] bytes) {
return super.defineClass(name.concat(".class"), bytes, 0, bytes.length);
}
}.defineClass(bytesOfClass).newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
return null;
}
}
Я думаю, это потому, что мой ClassLoader не знает зависимостей моего класса?
Как я могу избежать этой проблемы?
URLClassloader
, иначе это может привести к проблемам позже (он может либо не найти эти зависимости, либо загрузить их новыми - но класс A загружается из CL1 != класс A загружается из CL2, хотя класс равен на уровне байтов!) 2. Вы должны вызватьloadClass
в CL для загрузки класса иdefineClass
для загрузки байтов в память (будет вызыватьсяloadClass
/findClass
, если он не может найти класс в своем кеше или ни один из его родителей еще не знает определения. - person Roman Vottner   schedule 05.07.2015getClass().getClassLoader()
, если у вас есть CL для каждого потока, используйте вместо этогоThread.currentThread().getContextClassLoader()
- person Roman Vottner   schedule 05.07.2015getClass().getClassLoader()
, и это работает. Однако это будет библиотека, не лучше ли позволить пользователю решать, какой загрузчик классов он хочет использовать, как будет выглядеть наилучшее значение по умолчанию?Thread.currentThread().getContextClassLoader()
илиgetClass().getClassLoader()
- person user3858583   schedule 06.07.2015getClass().getClassLoader()
может быть достаточно. - person Roman Vottner   schedule 06.07.2015class.getClassLoader()
, которое вызовет исключение, если данный класс все равно не может быть найден. - person user3858583   schedule 06.07.2015