基础3种类加载器

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.一些例子

  1. 启动类加载器是获取不到的

    ClassLoader classLoader = String.class.getClassLoader(); (classLoader永远都是null)
    
  2. Extension不能加载classpath下类(这里会有ClassNotFoundException)

    ClassLoader classLoader = AccessBridge.class.getClassLoader();
    Class loadClass = classLoader.loadClass("test.ClassLoaderTest");
    
  3. 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);

你可能感兴趣的:(JVM)