类加载器,Junit单元测试,反射,注解

目录

 类加载器

类加载的过程 

类加载时机

类加载过程

1.加载

 2.链接

3. 初始化

类加载的分类(了解)

双亲委派模型

类加载器(ClassLoader )的常用方法  

Junit单元测试:

反射 :框架设计的灵魂

获取Class类对象的三种方式

反射获取构造方法并使用

通过Class类的方法获取构造方法对象【Constructor类对象】

利用Constructor类的方法创建实例对象【student实例对象 】

反射获取成员变量并使用

Class类获取成员变量对象的方法

Field类用于给成员变量赋值的方法

反射获取成员方法并使用

 Class类获取成员方法对象的方法

Method类用于执行方法的方法


 类加载器

作用:负责将.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.创建计算器对象
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值