public class ClassLoaderOrClassForName{ public static void main(String[] args) throws ClassNotFoundException{ ClassLoader loader = ClassLoader.getSystemClassLoader(); Class<?> loadClass = loader.loadClass("TestDiff"); System.out.println("Load Class : " + loadClass.getName());
System.out.println("------"); Class<?> forName = Class.forName("TestDiff"); System.out.println("Class for Name : " + forName.getName()); } } class TestDiff{ static { System.out.println("Static Method"); } }
output:
Load Class : TestDiff
------
Static Method
Class for Name : TestDiff
Class.forName方法将类的.class文件加载到jvm的同时会执行static方法块中的内容。
classLoader只会将类的.class文件加载到jvm中,不会执行static中的内容,只有在调用newInstance()方法调用构造函数,创建类的对象。
JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化。
加载阶段会在内存中生成一个代表这个类的Class对象,作为方法区这个类的各种数据的入口
验证阶段主要是为了确保Class文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害jvm自身的安全
准备阶段是正式为类变量分配内存并设计类变量的初始值阶段,即在方法区中分配这些变量所使用的内存空间
解析阶段是指虚拟机将常量池中的符号饮用替换为直接应用的过程,符号引用就是class文件中的CONSTANT_Class_info,CONSTANT_Field_info,CONSTANT_Method_info
初始化阶段是类加载最后一个阶段。初始化阶段是执行类构造器<client>方法的过程。<client>方法是由编译器自动收集类中的类变量的赋值操作和静态语句块中的语句合并而成。虚拟机会保证<client>方法执行前,父类的<client>方法已经执行完毕。
JVM提供了3种类加载器
Bootstrap ClassLoader:负责加载JAVA_HOME\lib目录中的,或通过Xbootclasspath参数指定路径中的,且被虚拟机认可的类
Extension ClassLoader:负责加载JAVA_HOME\lib\ext目录中的,或通过java.ext.dirs系统变量指定路径中的类库
Application ClassLoader:负责加载用户路径上的类库