Я предполагаю, что загрузка вашего класса выполняется как некоторая нажатием файлов классов. Вы должны скорее тянуть их. Для того, чтобы объяснить, что я имею в виду, давайте рассмотрим краткий пример нормального класса Java загрузка:
class Main {
public static void main(String[] args) {
new B();
}
}
class B extends A { }
class A { }
При создании new B()
, класс загрузчик Main
в основном выполняет classLoader.loadClass("B")
. На данный момент суперкласс класса B
A
еще не загружен. В то же время загрузчик классов не может знать, что B
имеет A
в качестве своего суперкласса. Таким образом, загрузчик классов берет на себя ответственность за загрузку класса, прося себя classLoader.loadClass("A")
до завершения загрузки класса B
.
Предположим, что загрузчик классов не знал ни о A
или B
, но это был метод явно загружать классы это получает от внешнего объекта с classLoader.inject(String, byte[])
. Эта последовательность вызова будет затем не вычислить:
classLoader.inject("B", bBytes);
classLoader.inject("A", aBytes);
, потому что при загрузке B
, класс заряжающий не знает о A
.
Что вам нужно сделать при внедрении свой собственный загрузчик классов для хранения классов в какой-то карте и реализовать метод класса загрузки что-то загрузчик класса как:
protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] bytes = map.get(name);
if (bytes != null) {
return defineClass(name, bytes, 0, bytes.length);
} else {
throw new ClassNotFoundException(name);
}
}
Позволяя загрузчик классов в определите порядок загрузки, вы полностью избегаете этой проблемы.
Чтобы быть еще более точным, что вам нужно сделать манипуляции и загрузки в два этапа, где алгоритм псевдо будет выглядеть примерно так:
Enumeration<JarEntry> entries = jarFile.entries();
MyClassLoader classLoader = new MyClassLoader();
// First we generate ALL classes that the class loader is supposed to load.
// We then make these classes accessible to the class loader.
while (entries.hasMoreElements()) {
JarEntry element = entries.nextElement();
if (element.getName().endsWith(".class")) {
// Class Manipulation via ASM
classLoader.addClass(...);
}
}
// Now that the class loader knows about all classes that are to be loaded
// we trigger the loading process. That way, the class loader can query
// itself about ANY class that it should know.
while (entries.hasMoreElements()) {
JarEntry element = entries.nextElement();
if (element.getName().endsWith(".class")) {
classLoader.loadClass(...);
}
}
Показать код закомментирована, который, когда фактический вопрос , (Если, конечно, ваш класс 'B' не указан или иным образом не включен в путь класса поиска.) – chrylis