【Java高级】单元测试、注解、反射、动态代理
junit
概述
- 是第三方公司编写的一个用于帮助程序员测试代码的框架;
特点
- 可以直接运行带 @Test注解的方法;(相当于main方法的功能)
- 可以自动生成测试报告;
- 可以批量运行多个方法,且部分方法出异常不会影响其他的测试;
使用步骤
入门代码
1 | /* |
断言
概述
可以对某件事情的结果进行预测,如果将来真实的结果和预测的结果一致,那么断言就成功了,否则断言就失败了,因此断言的结果必定是boolean值;
作用
- 可以检测程序中存在的逻辑问题;
使用方式
- 直接利用Assret类的静态方法assertEquals(提示信息,预计结果,真实结果)即可;
参考代码
1 | /* |
反射
概述
- 是一种可以在代码运行期间动态获取类的”组成部分”,并单独让这些”组成部分”执行起来的技术;
作用
- 配合多态的技术,可以处理很多通用的流程,是编写框架和工具非常常用的技术;
相关类
- Class 表示所有类的字节码文件对象的类型
- Construct 表示所有类中单独”抽取”出来的构造方法对象;
- Field 表示所有类中单独抽取出来的成员变量对象;
- Method 表示所有类中单独抽取出来的方法对象;
反射的通用步骤
- 获取类的字节码文件对象;
- 利用字节码文件对象,反射得到构造方法对象;
- 利用构造方法对象执行后得到一个普通对象;(等同于以前new的对象)
- 利用字节码文件对象,反射得到成员变量对象和方法对象;
- 让反射得到的成员变量或方法对象执行起来;
获取字节码文件对象的三种方式
1 | /* |
反射构造器
目的
- 为了通过构造器创建出普通的对象;
相关方法

参考代码
1 | /* |
- 让构造器执行

- 注意事项
- 如果是暴力反射的私有内容,执行前必须忽略权限检查,否则执行失败!
反射成员变量
目的
- 绕过多态,给指定的对象中的成员变量存值或取值;
相关方法

参考代码
1 | public class MyField { |
- 注意事项
- 如果是暴力反射的私有内容,执行前必须忽略权限检查,否则执行失败!
- 成员变量是随着对象的创建而存在,所以要想操作成员变量,必须提前创建出一个包含该成员变量的那个类的对象;
反射成员方法[重点]
目的
- 希望让类中的某个方法,单独运行起来,可以绕过多态的限制和泛型的限制;
相关方法

参考代码
1 | /* |
让反射得到的方法执行

参考代码
1 | public class TestMethod2 { |
反射的应用场景
- 反射可以绕过泛型的限制;
- 反射可以绕过多态的限制;
- 反射可以结合IO流技术,完成对象文件内容的操作;
- 反射可以动态的让多个类中的方法执行起来;
- …….
示例代码1-绕过泛型和多态

示例代码2-模拟idea自动生成gettersetter方法
1 | /* |
示例代码3-通用框架-将对象的所有成员变量写入文件

注解
概述
- 就是一个自定义的标记,将来我们可以通过反射的技术,获取这些标记,并进行相应的操作即可;
作用
- 可以给类或变量或方法添加注解,以便于将来对带有标记的内容进行解析;
- 也可以通过注解传递一些数据值,供方法或类或变量使用;
语法格式
- 定义注解使用 @Interface表示;
- 定义属性时,使用 权限修饰符 数据类型 变量名() default 默认值;的形式表示;

元注解
概述
- 注解注解的注解就是元注解;元注解是java提前写好的,可以对我们自定义的注解进行限制;
常用的元注解

- 具体作用


注解解析
- 概述
- 就是通过反射的技术,可以获取某个组件上面的注解对象及注解对象中保存的数据;
- 相关方法

注意事项
- 以上方法可以通过字节码文件(Class)对象,属性对象(Field),方法对象(Method)均可以调用;
- 自定义的注解必须使用元注解指定生命周期为 Runtime,否则代码运行的时候,自定义的注解会消失;
参考代码

- 应用场景介绍
- 模拟Junit的@Test功能

类加载器
概述
- 专门负责将java的类加载的内存中并形成字节码文件对象的东西;
作用
- 帮我们创建字节码文件对象的,目的是为了避免同一个类被多次加载!
分类
一共有3种类加载器:
- 应用类加载器: AppClassLoader作用主要是加载程序员自定义的类及第三方jar包的类;
- 平台类加载器: PlatformClassLoader 主要作用是加载java中已经提前准备好的API及扩展的类;
- 核心类加载器: 无法在java中直接获取使用(null);
- 获取方式
- 可以通过字节码文件对象的 getClassLoader方法即可获取类加载器;
参考代码
1 | /* |
动态代理
概述
- 在代码运行期间,动态的给某个类(目标类)生成一个代理类(可以对目标类进行增强的类)的技术,就是动态代理技术;
作用
- 可以在不改变已有类的功能的基础上对原有功能进行增强;
相关API
- jdk提供的Proxy类可以帮我们生成代理对象;
使用前提
- 目标类必须实现接口;
流程分析


All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.



