classloader 双亲委托
时间: 2023-09-12 20:01:39 浏览: 54
双亲委托是指在Java中的ClassLoader类加载器的一种加载机制。它的原则是当一个类加载器接收到加载类的请求时,首先会将这个请求委托给它的父类加载器去完成,只有当父类加载器无法完成加载时,才由该类加载器自己去加载。
双亲委托机制的设计初衷是为了保证Java中类的唯一性和安全性。其中双亲指的是父加载器和子加载器之间的关系,父加载器是子加载器的唯一父级,子加载器是父加载器的唯一子级。在类加载过程中,当一个类被加载时,首先会由最顶层的启动类加载器进行加载,如果没找到,再由其子类加载器尝试加载,依此类推,直到所需的类被加载或者没有加载器能够加载此类。
通过双亲委托机制,可以有效避免类的重复加载,提高了类的加载效率。这是因为在父加载器中已经加载过的类,在子加载器中不会再次加载,可以直接使用父加载器加载的版本,从而节省了加载时间和系统资源。
双亲委托机制还有助于保证类的安全性。由于父加载器优先加载类,可以避免子加载器加载一个恶意或者不安全的类。这样可以防止恶意类的被加载,保护了系统的安全性。
总的来说,通过双亲委托机制,Java类加载器可以按照一定的层次和规则进行类的加载,保证类的唯一性和安全性。
相关问题
java双亲表示法淑
Java的双亲委派模型是一种类加载机制,用于保证Java程序的安全性和稳定性。它是基于ClassLoader的工作原理来实现的。
在Java中,每个类加载器都有一个父类加载器,形成了一个层次结构。当一个类加载器需要加载一个类时,它首先会委托给它的父类加载器去加载。如果父类加载器无法加载该类,子类加载器才会尝试加载。这样一层一层的委托关系就形成了双亲委派模型。
这种模型的好处是可以避免类的重复加载,保证了类的唯一性。同时,它也可以防止恶意代码的加载,提高了Java程序的安全性。
具体来说,当一个类需要被加载时,Java虚拟机会首先检查是否已经被加载过。如果已经加载过,则直接返回该类的Class对象;如果没有加载过,则将加载请求委托给父类加载器。父类加载器会按照同样的方式进行检查和委托,直到顶层的启动类加载器。如果顶层的启动类加载器无法加载该类,则会回溯到子类加载器,子类加载器会尝试自己去加载该类。如果所有的父类加载器都无法加载该类,则会抛出ClassNotFoundException。
通过这种双亲委派模型,Java程序可以保证类的加载是有序的,避免了类的重复加载和冲突。同时,它也提供了一种机制,可以自定义类加载器,实现一些特殊的加载需求。
tomcat打破双亲委派模型
Tomcat打破了双亲委派模型,以实现依赖隔离的目的。根据引用中的描述,Tomcat在整体上满足双亲委派模型,但在局部打破了这个规则。这意味着Tomcat在加载类时,会先委托父类加载器加载,但对于一些特殊情况,Tomcat会自行加载类,而不再委托父类加载器。这种打破双亲委派模型的方式使得Tomcat能够实现类的依赖隔离。
根据引用所述,JDK自带的双亲委派模型是无法解决加载两个版本类的问题的,因为默认的ClassLoader#loadClass方法会检查类是否已经加载过,保证了类在进程中是唯一的。但是,如果我们需要加载两个版本的类,就需要打破原有的双亲委派模型。
Tomcat打破双亲委派模型的需求主要源于类加载的隔离要求。根据引用中的描述,Tomcat需要满足两点要求:一是不同的web应用可能会依赖相同第三方库的不同版本,需要保证它们之间的隔离;二是Tomcat自身的类库与所有的web应用也需要进行隔离。为了满足这些要求,Tomcat选择了打破双亲委派模型的方式来加载类,从而实现了依赖隔离的目的。
综上所述,Tomcat打破双亲委派模型,以实现依赖隔离的目的。