17.描述Java的双亲委派机制,为什么要用到双亲委派机制
时间: 2024-02-19 20:41:09 浏览: 24
Java的双亲委派机制是指,当类加载器收到类加载的请求时,它会首先将该请求交给父类加载器去完成,直到父类加载器无法完成该请求时,才会由子类加载器去完成。这种机制可以确保类的加载顺序,防止类的重复加载,并保证类的安全性。
双亲委派机制的出现,主要是为了避免类的重复加载和冲突问题。当我们需要使用某个类时,Java会首先从顶层的类加载器(如Bootstrap ClassLoader)开始查找,并在每一层的类加载器中都查找一次,直到找到指定类或找不到为止。这种方式可以确保加载的类都是唯一的,避免了类的冲突和重复加载问题。
同时,使用双亲委派机制可以保证类的安全性。如果子类加载器可以直接加载所有类,那么就有可能会加载到一些不安全的类,从而导致安全问题。通过让父类加载器完成类的加载,我们就可以避免子类加载器直接加载不安全的类,从而确保类的安全性。
总之,Java的双亲委派机制非常重要,可以确保类的唯一性、避免冲突和重复加载问题,并保证类的安全性。
相关问题
java的spi机制为什么要打破双亲委派机制
Java的SPI机制在加载第三方服务提供者的实现时,会使用线程上下文类加载器(Thread Context ClassLoader),而不是使用父类加载器(Parent ClassLoader)。
这是因为在双亲委派机制下,父类加载器无法访问子类加载器加载的类,而SPI机制需要访问应用程序中的第三方服务提供者的实现类,这些实现类可能是由子类加载器加载的。因此,使用线程上下文类加载器可以打破双亲委派机制的限制,从而实现SPI机制的动态加载。
另外,SPI机制的实现类通常是由第三方提供商提供的,而不是由应用程序开发者提供的。这些实现类可能依赖于某些特定的库或框架,这些库或框架的类可能无法被父类加载器加载。在这种情况下,使用线程上下文类加载器可以确保SPI机制的实现类能够被正确加载。
需要注意的是,打破双亲委派机制可能会带来安全隐患,因此应该谨慎使用线程上下文类加载器来加载类。在实现SPI机制时,应该尽可能地控制第三方提供商的实现,避免出现安全问题。
为什么要打破双亲委派机制
双亲委派机制是Java类加载器的一种经典实现方式,它是指一个类加载器在加载类时,会先将加载请求委派给父类加载器去完成,只有在父类加载器无法完成加载请求时,才会自己去加载。这种机制保证了Java类库的安全性和稳定性。但是,在某些特定的应用场景下,双亲委派机制也可能会导致问题。
一般情况下,双亲委派机制可以有效避免类的重复加载和保证类的唯一性,但是在某些情况下,可能需要打破这个机制。例如,当我们需要在同一个JVM中使用多个版本的同一个类时,由于双亲委派机制的存在,较新版本的类无法被加载,因为父类加载器已经加载了较旧版本的类。此时,我们需要打破双亲委派机制,使用自定义的类加载器来加载指定版本的类。
此外,在一些特定场景下,比如应用程序需要热部署、动态更新等功能时,也需要打破双亲委派机制。因为在这种情况下,我们需要动态地卸载和加载类,而双亲委派机制并不支持动态卸载已经加载的类。