JDK类加载器可以大致分为三类,分别是启动类加载器,扩展类加载器,以及应用程序加载器。类加载器就是根据指定全限定名称将class文件加载到JVM内存,转为Class对象。这是jdk为我们提供的几种类加载器。这三者加载类的路径分别为如下:
(Bootstrap ClassLoader) 启动类加载器:JAVA_HOME/lib目录下,以及被-Xbootcalsspath参数设定的路径,不过启动类加载器加载的类是有限制的,如果JVM不认识的话,就算放在这些目录下也没用。由C++语言实现(针对HotSpot)。启动类加载器无法被Java程序直接引用。
其他类型:开发者可以直接使用由Java语言实现,继承自抽象类ClassLoader:
(Extension ClassLoader )扩展类加载器:JAVA_HOME/lib/ext目录下,以及被java.ext.dirs系统变量指定的路径。sun.misc.Launcher.ExtClassLoader类实现功能
(ApplicationClassLoader).应用程序类加载器:用户自己的类路径(classpath),这个类加载器就是我们经常使用的系统类加载器,并且JDK中的抽象类ClassLoader的默认父类加载器就是它。
自定义类加载起需要继承ClassLoader类重写findClass()方法。jdk的类加载器采用的双亲委派模型保证了类加载过程的安全可靠。jvm对某一对象是否为同一对象的判断包含了是否由同一类加载器加载。
日常项目中的各类web容器大多自己实现了一套类加载的机制,典型的例如Tomcat,突破了双亲委派机制的限制。
当tomcat中部署多个应用时,放置jar包的一些规则:
在Tomcat目录结构中,有3组目录(“/common/*”、“/server/*”和“/shared/*”)可以存放Java类库,另外还可以加上Web应用程序自身的目录“/WEB-INF/*”,一共4组,把Java类库放置在这些目录中的含义分别如下:
1放置在/common目录中:类库可被Tomcat和所有的Web应用程序共同使用。
2放置在/server目录中:类库可被Tomcat使用,对所有的Web应用程序都不可见。
3放置在/shared目录中:类库可被所有的Web应用程序共同使用,但对Tomcat自己不可见。
4放置在/WebApp/WEB-INF目录中:类库仅仅可以被此Web应用程序使用,对Tomcat和其他Web应用程序都不可见。