类加载
类加载大致分为5个阶段:
- 加载:java类运行时候会生成一个class字节码文件,加载的过程就是去我们的操作系统寻找这个class文件。
- 链接:这个过程就是把class文件加载到java虚拟机,完成验证、准备、解析。
- 初始化:在虚拟机中根据class文件进行初始化。
- 使用:这个过程大家都明白。
- 卸载:使用完了,java虚拟机进行清理。
对于class.forName和classloader来说针对的就是第一个过程,也就是加载过程。不过这俩虽然有一定的相似性,但是区别还是挺大的。
在java中Class.forName()和ClassLoader都可以对类进行加载。
class.forName
class.forName()前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。注意这里的静态块指的是在类初始化时的一些数据,但是classloader却没有。
Class.forName()方法实际上也是调用的CLassLoader来实现的。 内部实际调用的方法是 Class.forName(className, true, classloader)
- className:表示我们要加载的类名
- true:指Class被加载后是不是必须被初始化。 不初始化就是不执行static的代码即静态代码,在这里默认为true,也就是默认实现类的初始化。
- ClassLoader.getClassLoader(caller):表示类加载器,到这你会发现forNanme其实也是使用的ClassLoader类加载器加载的。
- caller:指定类加载器。
classloader
ClassLoader是遵循双亲委派模型最终调用启动类加载器的类加载器,内部实际调用的方法是 ClassLoader.loadClass(className, false)。
先判断class是否已经被加载,如果被加载了那就重新加载,如果没有加载那就使用双亲委派原则加载。加载的时候并没有指定是否要进行初始化。
总结
class.forName()除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。当然还可以指定是否执行静态块。
classLoader将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。