类加载机制
叙述:类加载机制就是将.class文件加载到JVM,并形成class对象的机制。之后就可以对其实例化并使用,这个机制可以动态的加载外部的类、远程下载的class文件,并且可以做到类之间的隔离。
步骤:JVM加载的步骤:装载、链接、初始化。
装载:将class文件中的字节码加载到JVM,并通过全名(org.test.Test)和类加载器(ClassLoader)来加载到JVM中。
链接:负责对装载的二进制字节码的格式进行检验,初始化类中的静态标量并检查类中调用的接口、类。最后对所有的属性、方法进行检验。
初始化:初始化是执行静态初始化代码、构造器代码和静态属性的初始化
出发的方式:1.new 2.反射 3.子类调用初始化 4.JVM启动参数中的类
ClassLoader:有4种ClassLoader负责加载类。
1.Bootstrap ClassLoader
由C++实现的,来加载jre/lib/rt.jar、resources.jar等。在java中无法拿到此对象。
2.Extension ClassLoader
用来加载java扩展包,jre/lib/ext/*.jar。
3.System ClassLoader
用来加载参数中的指定的classpath的jar,在类中显示对应的是AppClassLoader。
4.User-Defined ClassLoad
是java开发人员继承ClassLoader抽象类自行实现的ClassLoader,可以加载非classpath中的类(网络下载的java、class),还可以在加载之前做一些事情。
加载顺序:
首先要说明一个误区,这个误区是经常理解有问题的。
classloader加载的只是class(类),不要认为它加载的是对象,这样你就会很是理解不了classloader加载顺序。
classloader的顺序是先父后子(这里因为Bootstrap ClassLoader在java中拿不到,所以他是最先完成加载的)
已委托的方式循序加载
例如:User-Defined ClassLoad有个一类要加载则先会去委托System ClassLoader加载依此类推,每个节点都会委托父节点去加载,
如果父节点没有加载到自己再去加载,如果父节点加载了将吧加载的引用返回给自己。
两个java类相同的条件不尽需要同样的包名和class而且加载器也必须相同,这样的类才算是统一各类。比如有classloaderA和classloaderB,都加在了
Test类,两次别加载的类是不一样的。这也体现出了隔离性。