Вы пытаетесь решить проблему самостоятельно. Если вы не хотите, чтобы ваш загрузчик классов делегировал родителям, не создавайте его с этим родителем. Вот простой пример того, как класс загружает другую версию. Все это должно заботиться о, не использовать свой собственный загрузчик класса в качестве родителя новой, но родитель собственного загрузчика
parent loader
↑ ↑
my own loader the new loader
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
public class Reloader {
static {
System.out.println("Initializing one version of the class");
}
public static void main(String[] args) throws IOException, ReflectiveOperationException {
Class<?> myClass=Reloader.class;
ClassLoader myLoader=myClass.getClassLoader();
URL[] u={ myClass.getProtectionDomain().getCodeSource().getLocation() };
// don't use our class loader but its parent loader:
try(URLClassLoader newLoader=new URLClassLoader(u, myLoader.getParent())) {
// load another version of our class in a different loader context
Class<?> newVersion = newLoader.loadClass(myClass.getName());
// see: it's a different class now
System.out.println(myClass==newVersion);
// having the same name
System.out.println(myClass.getName()==newVersion.getName());
newVersion.newInstance();// trigger initializer
}
}
}
Online test on Ideone:
стандартный вывод
Initializing one version of the class
false
true
Initializing one version of the class
Вы всегда можете изменить байт-код классов для загрузки, поэтому они загружаются с каким-то префиксом. – Ferrybig
Можете ли вы объяснить это более подробно? –
Если ваш новый загрузчик классов не должен использовать классы другого существующего загрузчика классов, почему вы делаете его дочерним элементом старого загрузчика классов? – Holger