我有一个简单的自定义ClassLoader
class CustomLoader extends ClassLoader {
@Override
protected Class findClass(String name) throws ClassNotFoundException {
System.out.println("In the custom loader");
throw new ClassNotFoundException();
}
}下面是我尝试在其中使用加载器的代码:
public static void main(String... str) throws ClassNotFoundException {
CustomLoader loader = new CustomLoader();
Class<?> cls = loader.loadClass("java.awt.Color");
System.out.println(cls);
System.out.println(cls.getClassLoader());
}结果是意料之中的:
class java.awt.Color
null在大多数文章中,您可以看到,当您在自定义加载器上调用loadClass时,它首先会尝试在其缓存中查找类。如果找不到,它会从父加载器(在本例中为Application loader)调用loadClass方法。引导加载程序也是如此。之后,如果bootstrap装载器在其缓存中找不到类,它会尝试在各自的源代码中找到它。如果加载器找不到它,子加载器会尝试查找,依此类推到自定义加载器。
如果您查看类加载器实现,您将看到它只是调用findClass方法。但是考虑到我使用的是自定义加载器,并且java具有多态性,那么只要父加载器调用findClass,它们就会调用我的方法,对吧?
同时,据说java不会一次加载所有的类,而且只有在必要的时候才会加载。
正如你所看到的,我们没有看到任何类类型转换异常,事实上我的重写方法甚至没有被调用。这意味着引导加载程序找到了Color类。
问题是我的错误在哪里?如果java没有从java加载所有的类...包当jvm启动时,它不会在缓存中找到类Color,它会调用我的重写方法。
(在代码中的任何其他地方都没有使用类Color )
发布于 2013-09-06 13:16:48
根据ClassLoader API,默认的委托模型是这样工作的。
当被请求查找类或资源时,ClassLoader实例将把对类或资源的搜索委托给它的父类加载器,然后再尝试查找类或资源本身。
此委托模型是在ClassLoader.loadClass方法中实现的,若要更改它,应覆盖loadClass方法而不是findClass
https://stackoverflow.com/questions/18650297
复制相似问题