JVM和类
系统出现以下情形,JVM进程将终止
1、程序运行到最后正常结束
2、使用System.exit()或Runtime.getRuntime().exit()
3、遇到未捕捉的异常或错误而结束
4、所在平台强制结束了JVM进程
类的加载:将class文件读入内存
当程序主动使用某个类时,若类仍未加载到内存中,则系统会通过加载、连接、初始化对该类初始化
若无意外,JVM连续完成三步骤
JVM提供类加载器,类加载器加载类
加载类的本源
1、本地文件系统加载class文件(大多数)
2、从JAR包加载class文件
3、网络加载class文件
4、把一个Java源文件动态编译执行加载
类的连接
1、验证
2、准备:
为类变量负责内存
并设置默认初始值
3、解析
将类的二进制数据中的符号引用替换成直接引用
类的初始化
1、优先加载并连接
2、先初始化父类
3、优先执行初始化语句
初始化时机
1、创建类的实例
2、调用某个类的方法
3、访问某个类或接口的类变量
4、使用反射方式强制创建某个类或接口对应的java.lang.class对象
5、初始化某个类的子类
6、java.exc运行某个主类
ClassLoader加载器类
loadClass()加载
forName()强制初始化
类加载器层次结构:
根类加载器:非ClassLoader子类,由JVM自身实现
扩展类加载器
系统类加载器
类加载机制
全盘托出:
一个类加载器加载某个类时,该类所依赖和引用的其他Class也由该类加载器加载
父类委托
缓存机制
已夹在过的CLass会翻入缓存
使用某类时,检索缓存区NOT EXIST 加载
URLClassLoader
系统类加载器与扩展类加载器父类
通过反射查看类信息
获得Class对象三种方式1、forName()
2、类名.class
3、对象名。getclass()
通过反射生成对象的方式:
1、使用Class对象的newInstance()方法来创建该Class对象对应类实例
要求:有默认构造器
2、使用Class对象获取指定Constructor对象
再调用Constructor对象的newInstance()
来创建该Class对象类的实例
第一类比较常见
因为在很多JavaEE框架中都需要根据配置文件来创建Java对象,从配置文件读取的只是某个类的字符串类名,程序需要根据该字符串来创建对应实例,必须用反射