java为什么findLoadedClass方法调用返回不同的结果
考虑自定义类加载器^ {< CD1> }
如果我按如下方式调用loadClass
ClassLoader loader = new ClassLoader(){};
loader.loadClass("java.util.ArrayList");
Method method = ClassLoader.class.getDeclaredMethod("findLoadedClass", String.class);
method.setAccessible(true);
System.out.println(method.invoke(loader,"java.util.ArrayList"));
它输出null
但如果我替换
loader.loadClass("java.util.ArrayList");
与
Class.forName("java.util.ArrayList",true,loader);
它输出class java.util.ArrayList
有人能解释这个问题吗
# 1 楼答案
默认的
ClassLoader
实现按以下顺序执行类加载:这是从Javadoc中直接提取的
当您调用
loadClass
时,您的实现将委托给父类加载器,然后再尝试自己加载它。这恰好是您的系统类装入器在本例中,您的类已经在系统类加载器的类路径上,因此它被加载
稍后调用
findLoadedClass
时,该方法仅检查指定的类加载器是否已加载该类。它不执行进一步的授权当您调用
method.invoke(loader, "java.util.ArrayList")
时,您正试图在CustomerClassLoader
中找到加载的类。这会失败,因为执行加载的是父类加载器您可以通过调用系统类加载器上的方法来证明这一点,如下所示: