类加载器 搜索顺序

来源:百度知道 编辑:UC知道 时间:2024/06/03 13:23:34
今天看了一些关于java类加载器的资料,有点糊涂了,系统找某个类时的搜索顺序为
1:在当前包下找;
2在jre/lib/rt.jar下找;
3在classpath路径下找。
而类加载器加载类时采用委托模式,先从最顶层找。
我不太理解这个到底矛不矛盾。按我的理解,当程序用到某个类时,然后去搜索,然后再去加载。搜索顺序为什么和加载顺序不同?

一些保证系统正常启动核心类会自动加载的,用户自定义的类会在运行时动态加载,你说的搜索应该就是类加载器加载类的策略问题。
JVM在运行时会产生三个类加载器:Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader。Bootstrap是用C++编写的,是JVM自带的类装载器,用来装载核心类库,如java.lang.*等。AppClassLoader的Parent是ExtClassLoader,而ExtClassLoader的Parent为Bootstrap ClassLoader。之所以要定义这么多类加载器(当然还可以自己扩展)是因为java是动态加载类的,用到什么就加载什么以节省内存,采用逐级加载的方式,
(1)首先加载核心API,让系统最基本的运行起来
(2)加载扩展类
(3)加载用户自定义的类
通过查看系统属性可以查看三个类加载器加载类的路径,比如启动类加载器会加载jdk包里的rt.jar(里面有java.lang.*,所以不需要我们在import了,当然还有其他很多jar),用户自定义类加载器会加载classpath中的jar
类加载器工作时采用委托模式,当我们调用一个ClassLoader加载程序的时候,这个ClassLoader会先调用设置好的parent ClassLoader来加载这个类,如果parent是null的话,则默认为Boot ClassLoader类,只有在parent没有找的情况下,自己才会加载,这就避免我们重写一些系统类,来破坏系统的安全。