这是在百度搜到的,我觉得不错
一些保证系统正常启动核心类会自动加载的,用户自定义的类会在运行时动态加载,你说的搜索应该就是类加载器加载类的策略问题。
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没有找的情况下,自己才会加载,这就避免我们重写一些系统类,来破坏系统的安全。 |
|