jvm类加载器

类与类加载器

  对于任意一个类,都是需要加载它的类和其本身确认其在java虚拟机中的唯一性。每一个类加载器都有一个独立的类名称空间。换句话说如果在一个虚拟机中,2个类来源于一个Class文件,但是加载他们的类加载器不一样,那么这2个类也不一样。比如我们自己实现一个类加载器,并且实例化,那么这个对象确实是这个类实例化出来的,但是Class类型却和默认加载出来的Class类型不一样。
  从虚拟机角度讲,虚拟机分为2个,一个是C++语言实现的,是虚拟机的一部分,一部分是java代码实现的。全部继承于java.lang.ClassLoader.
  从开发角度来看,分为3种。
  1.启动类加载器
  这个类加载器是将\lib目录下,或者-Xbootclasspath参数所指定的路径中,且被虚拟机识别的类库加载到虚拟机内存里面。开发者无法直接使用。
  2.扩展类加载器
  这个加载器主要是加载\lib\ext目录下的。开发者可以使用。
  3.应用类加载器
  这个类加载器负责加载Classpath路径下的所指定的类库,也就是用户一般的类,如果代码没有明确定义只用自己的类加载器,那么这个就是程序默认的类加载器。
  4,用户自定义的类加载器
  这个就是开发者自己定义开发的类加载器。

双亲委派原则

  除了启动类加载器外,其余的的类加载器都有自己的父类加载器。加载器的顺序上下就是上面的顺序。其父子关系不是通过继承实现的,而是通过组合实现的。
  该原则是当改类加载收到请求时,他是不会先加载,而是委托给父类加载器,不断委托,当父类加载器无法在其搜索范围内找到这个类时,才会委托给下级加载器。这是个规范,系统的默认是这个,而自定义的类加载器要自己实现。
  使用这个有个好处。就是java类跟随类加载器有了一种优先级的层次关系了,比如Object类存放在\lib目录下,就默认只能是启动类加载器去加载的了,那么这个程序中就只会有一个Object类,程序也更加稳定。