再回首Java第二十二天
类加载器的种类:
1.Bootstrap ClassLoader: 负责加载Java核心类,即$JAVA_HOME/jre/lib/rt.jar,由C++实现
2.Extension ClassLoader: 负责加载Java平台扩展功能的一些jar,包括$JAVA_HOME/jre/lib/*.jar和$JAVA_HOME/jre/lib/ext/*.jar
3.System(App) ClassLoader:负责加载classpath中指定的jar或.class
4.Custom ClassLoader:属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader
加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只被所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。
类加载的过程:
一、加载:将.class文件加载到内存中,并为之生成java.lang.Class对象
二、链接:
1.验证:检验被加载的类是否有正确的内部结构,并与其它类协调一致
2.准备:为类属性分配内存空间,并赋默认值
3.解析:将二进制文件中的符号引用转换成直接引用
三、初始化:进入初始化阶段,JVM负责对类进行初始化,也就是对静态属性进行初始化。对静态属性进行初始化的方式有两种:声明静态属性时指定初始值;静态初始化块中指定初始值
类初始化包含的步骤
1.假如这个类还没有被加载和链接,程序先加载链接该类
2.如果该类的直接父类还没有被初始化,则先初始化其直接父类
3.假如该类中有初始化语句,则系统依次执行这些初始化语句
当执行到第二步时,系统对直接父类的初始化步骤也遵循这三个步骤,依次类推,JVM最先初始化的类总是java.lang.Object类,当程序初始化一个类的时候,系统会保证该类以及它的所有父类都会被初始化
类初始化的时机:
1.使用new关键字实例化类时,使用反射创建Class对象对应类的实例时,使用反序列化创建对象时
2.调用类的静态方法时
3.使用类的静态属性时(final static)属性除外,因为这样的属性在编译期就会被直接替换成实际值
4.初始化子类时,子类的所有父类都会被初始化
5.使用反射强制创建类或接口对应的Class对象时
6.使用java.exe命令运行主类时,JVM会先初始化主类
什么是反射,反射机制可以实现什么样的功能
在Java中反射就是指可以在运行期载入,探知和使用编译时期完全未知的类或接口
获取类的信息,动态创建类的对象,设定成员变量的值,调用方法和动态地创建访问数组
Java中获取Class对象的方法:类名.class、对象.getClass()、Class.forName方法
Class类的getFields()、getMethods()、getConstructors()方法同getDeclaredFields()、getDeclaredMethods()、getDeclaredConstructors方法的区别在于前面的方法只能获取public修饰的,而后面的能获得所有访问权限控制符修饰的
Java中创建对象的四种方式为:new 反射 克隆 反对象序列化
通过反射创建对象的两种方式
1.使用Class对象的newInstance()方法来创建该Class对象对应类的实例。这种方式要求Class对象对应的类有默认的构造器,执行newInstance()方法时,实际调用的是默认的构造器来创建实例
2.使用Class对象获取对应的Constructor对象,再调用Constructor对象的newInstance()方法创建Class对象对应的类的实例