0.被加载的自定义类
public class ClassLoaderTest {
public void say() {
System.out.println("This is Test.");
}
}
1.系统默认类加载器
BootStrap加载器:主要加载rt.jar,它是Java基础类库,里面有String等类
Extension加载器:主要加载jre/lib/ext目录下jar,其中包含Java的一些加密方法等
Application(System)加载器:加载classpath下jar
2.类加载器三种机制
委托:当加载一个Class时,当前加载器会先委托父加载器加载 如果父加载器没能加载 则自己加载
可见:父加载器加载的Class,对子加载器都是可见的,而子类加载的Class父加载器不知道
单一:一个Class只能被加载一次
3.一些例子
-
启动类加载器是获取不到的
ClassLoader classLoader = String.class.getClassLoader(); (classLoader永远都是null)
-
Extension不能加载classpath下类(这里会有ClassNotFoundException)
ClassLoader classLoader = AccessBridge.class.getClassLoader(); Class<?> loadClass = classLoader.loadClass("test.ClassLoaderTest");
-
Application加载classpath下类,完全没有问题
ClassLoader classLoader = TempDemo.class.getClassLoader(); Class<?> loadClass = classLoader.loadClass("test.ClassLoaderTest"); Object obj = loadClass.newInstance(); Method method = loadClass.getMethod("say"); method.invoke(obj);
4.显示类加载器API调用
Class<?> loadClass = Class.forName("test.ClassLoaderTest");
Object obj = loadClass.newInstance();
Method method = loadClass.getMethod("say");
method.invoke(obj);