类加载器是什么?
Java程序启动时(或者在运行的过程中), jvm(Java虚拟机)会完成类的加载, 其中第一步就是使用类加载器classLoader将二进制流(.class文件)加载到内存中.
类加载器就是这样一个用来加载类文件的关键工具.
什么时候会触发类的加载?
Java虚拟机并没有强制要求何时必须完成对类的加载, 但是要求了类如果需要初始化的时候, 必须在这之前完成类的加载.
因此可以认为类初始化是类加载的触发时间点
Java虚拟机规定,有且只有以下五种情况时,必须立即对类进行初始化:虚拟机在用户指定包含main方法的主类后启动时
当使用 new 关键字对类进行实例化时、读取或者写入类的静态字段时、调用类的静态方法时,必须先触发对该类的实例化
使用反射对类进行反射调用时,如果该类没有初始化,必须先触发其初始化
初始化一个类,而该类父类还未初始化时,需要先对其父类进行初始化
在JDK7之后的版本中使用动态语言支持,java.lang.invoke.MethodHandle实例解析的结果是REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,而该句柄对应的类还未初始化时,必须先触发其实例化
什么样的类是同一个类?
jvm判断两个类是否是同一个类有两个条件类的全名相同 (即包全路径 + 类名)
类加载器相同
类加载器有哪些?
如果只是常规使用, 我们无需关心类加载器的相关问题, jvm中内置了3个类加载器已经能满足我们的日常需要.
内置类加载器根据层级从上往下依次是启动类加载器 -> 扩展类加载器 -> 应用程序类加载器