java类的加载机制————父类委托

一  概述

•父类委托,先让父类加载器试图加载该类,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。

父类委托模式要求除了顶层的启动类加载器之外,其余的类加载器都应该有自己的父类加载器,但是在父类委托模式中父子关系采取的并不是继承的关系,而是采用组合关系来复用父类加载器的相关代码。

                JVM中的四种类加载器的层次结构 

二 工作原理和优势

工作原理

如果一个类收到了类加载的请求,它并不会自己先去加载,而是把这个请求委托给父类加载器去执行,如果父类加载器还存在父类加载器,则进一步向上委托,依次递归,请求最后到达顶层的启动类加载器,如果弗雷能够完成类的加载任务,就会成功返回,倘若父类加载器无法完成任务,子类加载器才会尝试自己去加载,这就是双亲委派模式。就是每个儿子都很懒,遇到类加载的活都给它爸爸干,直到爸爸说我也做不来的时候,儿子才会想办法自己去加载。

优势

采用双亲委派模式的好处就是Java类随着它的类加载器一起具备一种带有优先级的层次关系,通过这种层级关系可以避免类的重复加载,当父亲已经加载了该类的时候,就没有必要子类加载器(ClassLoader)再加载一次。其次是考虑到安全因素,Java核心API中定义类型不会被随意替换,假设通过网路传递一个名为java.lang.Integer的类,通过双亲委派的的模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字类,发现该类已经被加载,并不会重新加载网络传递过来的java.lang.Integer.而之际返回已经加载过的Integer.class,这样便可以防止核心API库被随意篡改。可能你会想,如果我们在calsspath路径下自定义一个名为java.lang.SingInteger?该类并不存在java.lang中,经过双亲委托模式,传递到启动类加载器中,由于父类加载器路径下并没有该类,所以不会加载,将反向委托给子类加载器,最终会通过系统类加载器加载该类,但是这样做是不允许的,因为java.lang是核心的API包,需要访问权限,强制加载将会报出如下异常。

注意的点: 类加载器负责加载所有的类,系统为所有被载入内存中的类生成一个java.lang.class实例。一旦一个类配载入JVM中,同一个类不能被再次载了。

  • 在JVM中标识两个Class对象,是否是同一个对象存在的两个必要条件
  • 类的完整类名必须一致,包括包名。
  • 加载这个ClassLoader(指ClassLoader实例对象)必须相同。

猜你喜欢

转载自blog.csdn.net/qfc8930858/article/details/89762529
今日推荐