【所思】
自己应用中重写个String类,包名跟rt.jar中的String一样,程序调用中是用自己写的String类呢还是用rt.jar中的类呢?JAVA如何避免这危险动作呢
【所得】
双亲委派机制,败家子机制
【双亲委派机制】
(1) 类加载器是如何知道自己加载那些类呢?
通过系统属性设置:System.getProperty(“java.class.path”);
(1)启动类加载器加载/jre/lib下的核心类库 ,rt.jar就会启动类加载器加载
(2)扩展类加载器加载/jre/lib/ext System.getProperty(“java.ext.dirs”);
(3)应用程序类加载器 加载classpath下的类,也可通过代码打印加载的路径,代码如下
package com.study.classloader;
import sun.misc.Launcher;
import java.net.URL;
import java.net.URLClassLoader;
public class Test5 {
public static void main(String[] args) {
//启动类加载器加载的jar
System.out.println("========启动类加载器加载的jar==================");
URL[] urls = Launcher.getBootstrapClassPath().getURLs();
for(URL url:urls){
System.out.println(url);
}
System.out.println("========展类加载器加载的jar==================");
//取得扩展类加载器,扩展类加载器加载的jar
URLClassLoader extClassLoader = (URLClassLoader)ClassLoader.getSystemClassLoader().getParent();
urls = extClassLoader.getURLs();
for(URL url:urls){
System.out.println(url);
}
//系统类加载器加载的jar
System.out.println("========系统类加载器加载的jar==================");
URLClassLoader appClassLoader = (URLClassLoader)ClassLoader.getSystemClassLoader();
urls = appClassLoader.getURLs();
for(URL url:urls){
System.out.println(url);
}
}
}
类不会重复加载
类的唯一性:同一个类加载器,类名一样,代表同一个类。
如何实现动态加载,应用程序热部署?
发现类有变化,用另一个类加载器加载新的类,例子:tomcat中jsp。