1.ClassLoader是JVM实现的一部分,包括bootstrap classloader(启动类加载器)。ClassLoader在JVM运行的时候加载JAVA核心的API,以满足Java程序最基本的需求,其中就包括用户定义的ClassLoader,这里所谓的用户定义,是指通过Java程序实现的两个ClassLoader:一个是ExtClassLoader,它的作用是用来加载Java的扩展API,也就是/lib/ext中的类;第二个是AppClassLoader,它是用来加载用户机器上CLASSPATH设置目录中的Class的,通常在没有指定ClassLoader的情况下,程序员自定义的类就由该ClassLoader进行加载。
一个类的加载过程使用了一种父类委托模式:a.避免重复加载:当父类已经加载了该类的时候,就没有必要子ClassLoader再加载一次。b.安全:比如如果不使用这种委托模式,那么可以随时使用自定义的String来动态替代Java核心API中定义的类型,这样会存在非常大的安全隐患,而父类委托的方式就可以避免这种情况,因为String已经在启动时被加载,所以用户自定义类是无法加载一个自定义ClassLoader的。
2.静态方法 Class.forName()目的和loadClass一样都是用来加载class但作用上有区别。
在JVM加载类的时候,需要经过3个步骤:装载、连接、初始化。
a.装载就是找到相应的class文件,读入JVM;
b.连接分三步:1.验证class时候符合规格。2.准备,就是为类变量分配内存的同时设置默认初始值。3.解释,可选的,解释是指根据类中的符号引用查找相应的实体,再把符号引用替换成一个直接引用的过程。
c.初始化就是class文件初始化。