Java应用类加载器原理与应用

Java类加载器架构

在典型的Java SE应用程序中,Java SE平台中java.*包下的类都将被加载到特定的根类加载器中,并且不能被覆盖。
这时Java的一种安全机制,这种机制能够有效的阻止恶意代码的执行。例如:替换String类,或是重定义Boolean.TRUE和Boolean.FALSE。

Java SE中的类加载机制

在Java SE中,根类加载器的之后是扩展类加载器,它主要用于加载JRE安装目录下的扩展JAR文件。接下来才是我们自己实现的应用程序类加载器,
应用程序类加载器将加载应用程序中的所有其它类。这样的类加载器顺序变组成了类加载器的层次结构:
- 根类加载器是所有类加载器最早的祖先。
- 当低级别的类加载器申请加载一个类时,它总是首先将该任务委托给它的父类加载器。
- 父类加载器收到委托后将继续向上委托直至根类加载器确认成功。
- 如果类加载器的父类加载器未能够找到要加载的类,那么当前的类加载器将尝试从自己的JAR文件和目录中加载目标类。
这样的类加载过程被称为: 双亲优先类加载委托模式

Java EE中的类加载机制

在Java EE平台中,Java SE的类加载机制在大部分单机Web应用情况下依然还是适用的。但是,由于运行Java EE Web应用程序的服务器通常都相当复杂,不同的服务器供应商有着自己不同的实现方案。服务器很有可能适用了与我们自己的Web应用程序相同的第三方库,或者是不同的服务器实现厂商都使用同样的第三方库等。这时,这几者之间有极大的可能出现文件版本冲突。这个时候如果继续使用Java SE中的类加载机制,冲突发生的概率将更进一步增加。
为了解决上面的Web应用中存在的问题,我们需要在Java EE Web应用中采用另外一种类加载机制– 子女优先类加载委托模式
在Java EE Web应用服务器中,每个Web应用程序都被分配了一个自由的、相互隔离的类加载器,它们都继承自公共的服务类加载器
通过上面的这种隔离机制,使得不同的应用程序相互隔离开来,不同的应用之间不能访问对方的类。不仅解决了Java SE中双亲优先类加载委托模式带来的冲突问题,同时也使得Web应用程序更加安全的运行。
通过这种:子女优先类加载委托模式,类加载的任务会在最后而不是优先委托给它的父亲,而是优先由子女进行加载。这样,Web应用程序中的类和库将会被优先使用,而不是服务器中的自带的库优先加载。这样的模式有助于解决很多版本冲突问题,但是并不能保证能解决所有问题,这时解决的方案更多的是依赖于服务器提供给商解决。

最后:为了维持绑定的Java SE类的安全状态,Web应用程序类加载器仍然会在尝试加载任何类之前先与根类加载器进行确认

你可能感兴趣的:(java类加载器,Web应用类加载器,类冲突解决)