1. 怎样理解 ClassLoader
类
ClassLoader
是一个抽象类Bootstrap ClassLoader
:是 JVM 实现的一部分,不是 Java 语言实现的,一般是 C++ 实现的,没有对应的具体的类Extension ClassLoader
:的具体实现类是sun.misc.Launcher$ExtClassLoader
Application ClassLoader
:的具体实现类是sun.misc.Launcher$AppClassLoader
每个
Class
对象都有一个方法,可以获取实际加载它的ClassLoader
,方法是:public ClassLoader getClassLoader()
ClassLoader
有一个方法,可以获取它的父ClassLoader
,方法是:public final ClassLoader getParent()
。如果ClassLoader
是Bootstrap ClassLoader
,返回值为null
ClassLoader
有一个静态方法,可以获取默认的系统类加载器,方法是:public static ClassLoader getSystemClassLoader()
ClassLoader
中有一个主要方法,用于加载类,方法是:public Class<?> loadClass(String name) throws ClassNotFoundException
由于双亲委派机制,
Class
的getClassLoader
() 方法返回的不一定是loadClass()
的ClassLoader
2. Class
的两个静态方法 forName()
的区别
public static Class<?> forName(String name)
:使用系统类加载器加载public static Class<?> forName(String name, boolean initialize, ClassLoader loader)
:指定ClassLoader
,参数initialize
表示加载后是否执行类的初始化代码(如static
语句块),没有指定默认为true
3. ClassLoader
的 loadClass()
方法与 Class
的 forName()
方法都可以加载类,它们的区别是
- 基本是一样的
- 不过,
ClassLoader
的loadClass()
方法不会执行类的初始化代码
4. 试分析 ClassLoader
的 loadClass()
方法源码
1 | public Class<?> loadClass(String name) throws ClassNotFoundException { |