ClassLoader负责将所有编译生成.class字节码的二进制数据流通过io传入jvm的runtimedata的方法区。
对于类本身来说:
1.编译器将E.java源文件编译为E.class字节码文件
2. ClassLoader将字节码转换为JVM中的Class<> 对象
3. JVM利用Class<>对象实例化为E对象
假设没有自定义加载器:
三层加载:app——>ext——>bootstrap
首先由app判断类是否被加载过,如果加载过,返回。
如果没有加载过就会交给app的父类ext,重复上述过程。
循环一直到Bootstrap,如果都没有加载过,就会自顶向下,去加载类。首先来到的是rt.jar或者看看是否是自己导入进来的jar包,去加载一下。如果没有,就会依次按照所给路径,按照Bootstrap ClassLoader->ExtClassLoader->AppClassLoader->CustomClassLoader去负责寻找他们对应所管辖的加载类的路径去负责加载对应的类文件。
**
需要注意的是,类加载器本身都是用同步锁包裹着的,防止多线程同步加载类。
**