目录
通过Class类的方法获取构造方法对象【Constructor类对象】
利用Constructor类的方法创建实例对象【student实例对象 】
类加载器
作用:负责将.class文件(存储的物理文件)加载在到内存中
类加载的过程
类加载时机
-
创建类的实例(对象)
-
调用类的类方法
-
访问类或者接口的类变量,或者为该类变量赋值
-
使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
-
初始化某个类的子类
-
直接使用java.exe命令来运行某个主类
总结:用到就加载,不用不加载
类加载过程
1.加载
-
通过全类名【包名 + 类名】,获取这个类的字节码文件,准备用流进行传输【java中所有数据传输都已是流形式进行】
-
在这个类文件加载到内存中【字节码文件加载到内存】
-
加载完毕创建一个class对象【当一个类加载到内存之后不能随处乱放,虚拟机创建这个类的class对象来存储类中对应的内容】
-
类名为Class类的实例对象 Class XXX = new Class();
硬盘中存的字节码文件,通过流传输到内存,在内存创建一个字节码文件对象:class对象来进行存放,比如student类,在内存中存的是名字为【student.class】的对象
2.链接
-
验证
-
准备
-
解析
3. 初始化
小结
当一个类被使用的时候,才会加载到内存
类加载的过程: 加载、验证、准备、解析、初始化
类加载的分类(了解)
-
分类
-
Bootstrap class loader(启动类加载器):虚拟机的内置类加载器,通常表示为null ,并且没有父null
-
Platform class loader:平台类加载器,负责加载JDK中一些特殊的模块
-
System class loader:系统类加载器,负责加载用户类路径上所指定的类库【常用】
-
-
类加载器的继承关系
-
System的父加载器为Platform
-
Platform的父加载器为Bootstrap
-
双亲委派模型
介绍
类加载器之间的层次关系成为双亲委派模型
系统类加载器父类是平台类加载器,平台类的父类是启动类加载器,此继承关系不是物理上的 extends继承而是在逻辑上的继承。
假设用最下面的类加载器去加载一个字节码文件,不会自己去加载,而是把任务委派给父类加载器去完成,系统类委派给平台类,平台类在委派给启动类加载器,将此传递委托过程称为逻辑上的继承。
每种加载器都有自己的加载范围,当父类加载器无法完成任务要求是就会一层一层往下返回,下面的子加载器才会尝试完成
如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式
* 获取类加载器
public class ClassLoaderDemo1 {
public static void main(String[] args) {
//获取系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
//获取系统类加载器的父加载器 --- 平台类加载器
ClassLoader classLoader1 = systemClassLoader.getParent();
//获取平台类加载器的父加载器 --- 启动类加载器
ClassLoader classLoader2 = classLoader1.getParent();
System.out.println("系统类加载器" + systemClassLoader);
System.out.println("平台类加载器" + classLoader1);
System.out.println("启动类加载器" + classLoader2);
}
}
类加载器(ClassLoader )的常用方法
方法介绍
方法名 | 说明 |
---|---|
public static ClassLoader getSystemClassLoader() | 获取系统类加载器 |
public InputStream getResourceAsStream(String name)【文件名】 | 加载某一个资源文件 |
利用加载器加载一个指定的文件
参数为文件路径
返回值:字节流
Junit单元测试:
* 测试分类:
1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。
2. 白盒测试:需要写代码的。关注程序具体的执行流程。
* Junit使用:白盒测试
* 步骤:
1. 定义一个测试类(测试用例)
* 建议:
* 测试类名:被测试的类名Test CalculatorTest
* 包名:xxx.xxx.xx.test cn.itcast.test
2. 定义测试方法:可以独立运行
* 建议:
* 方法名:test测试的方法名 testAdd()
* 返回值:void
* 参数列表:空参
3. 给方法加注解 @Test
4. 导入junit依赖环境
* 判定结果:
* 红色:失败
* 绿色:成功
* 一般我们会使用断言操作来处理结果
* Assert.assertEquals(期望的结果,运算的结果);
* 补充:
* @Before:【初始化方法】
* 修饰的方法会在测试方法之前被自动执行
* @After:【释放资源方法】
* 修饰的方法会在测试方法执行之后自动被执行
/**
* 初始化方法:
* 用于资源申请,所有测试方法在执行之前都会先执行该方法
*/
@Before
public void init(){
System.out.println("init...");
}
/**
* 释放资源方法:[比如IO流的释放资源]
* 在所有测试方法执行完后,都会自动执行该方法
*/
@After
public void close(){
System.out.println("close...");
}
/**
* 测试add方法
*/
@Test
public void testAdd(){
// System.out.println("我被执行了");
//1.创建计算器对象