Если ваш загрузчик классов реализован правильно, он сначала спросит своего родительского загрузчика классов о любых классах, которые должны быть загружены.
Родительский загрузчик классов вашего загрузчика, вероятно, будет обычным загрузчиком классов приложения.Это означает, что каждый класс, который загружает ваш загрузчик классов, сначала будет искать в загрузчике классов приложения, и только если он не найден, в вашем.
Все классы, которые определены вашим загрузчиком классов, также будут искать нужные им классы вваш загрузчикЕсли они этого не делают, ваш ClassA на самом деле не загружается вашим загрузчиком.
Если это не поможет, вам нужно будет показать некоторый код того, как вы добились своих результатов.
Идея о том, что делать:
class ModifyingClassLoader extends URLClassLoader {
// TODO: add constructors
private boolean needsModifying(String name) {
// TODO
}
private byte[] modifyClass(InputStream original) throws IOException {
// TODO
}
public Class<?> findClass(String name) throws {
if(needsModifying(name)) {
try {
InputStream classData = getResourceAsStream(name.replace('.', '/') + ".class");
if(classData == null) {
throw new ClassNotFoundException("class " + name + " is not findable");
}
byte[] array = modifyClass(classData);
return defineClass(name, array, 0, array.length);
}
catch(IOException io) {
throw new ClassNotFoundException(io);
}
}
else {
return super.findClass(name);
}
}
}
На ваш вопрос:
Есть ли способ указать загрузчику родительского класса найти и определить класс, НОустановить загрузчик класса контекста класса на свой?
Нет.ClassLoader класса всегда тот, чей метод defineClass
был вызван для создания класса.(Загрузчик классов контекста - это нечто иное - он специфичен для потоков и используется только классами, которые явно хотят его использовать, а не классами, разрешающими свои собственные прямые зависимости.)