006-Java高级技术
Java高级技术
单元测试
- 就是针对最小的功能单元:方法,编写测试代码对其正确性测试
- 我们之前是如何进行单元测试的?有什么问题?
- 只能在main方法编写测试代码,去调用其他方法进行测试
- 无法实现自动化测试,一个方法测试失败,可能影响其他方法的测试
- 无法得到测试的报告,需要程序员自己去观察测试是否成功
Junit单元测试框架
-
可以用来对方法进行测试,它是第三方公司开源出来的(很多开发工具已经继承了Junit框架,比如IDEA)
-
优点
- 可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键完成全部方法的自动化测试,且各自独立
- 不需要程序员去分析测试的结果,会自动生成报告出来
-
具体步骤
- 将Junit框架的jar包导入到项目中(注意:IDEA继承了Junit框架,不需要我们自己手工导入了)
- 为需要测试的业务类,定义对应的测试类,并为每个业务方法,编写对应的测试方法(必须:公共、无参、无返回值)
- 测试方法上必须声明@Test注解,然后在测试方法中,编写代码调用被测试的业务方法进行测试
- 开始测试: 选中测试方法,右键选择“Junit运行”,如果测试通过则是绿色;如果测试失败,则是红色
-
示例
-
工具类
-
测试类
-
第二个方法测试时,index本应该是6,但实际上,方法获取长度后没有减一,输出后显示是7
-
解决方法:做断言:断言结果事都与预期一致
-
右键Module可以一键运行模块内的所有测试方法
-
反射(Reflection)
-
反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)
反射学什么
-
学习获取类的信息、操作它们
-
步骤
-
加载类,获取类的字节码:Class对象
-
获取Class的三种方式
Class c1 = 类名.class
- 调用Class提供方法:
public static Class forName(String package);
- Object提供的方法
public Class getClass();
Class c3 = 对象.getClass();
-
-
获取类的构造器Constructor对象
-
获取类的成员变量:Field对象
-
获取类的成员方法:Method对象
-
反射获取类中的成分并操作
-
示例
-
获取构造器的作用依旧是创建对象
-
暴力反射:暴力反射可以访问私有的构造器、方法、属性
-
-
反射可以理解为:反射是类找程序员,new是程序员找类
-
获取到成员变量的工作:依然是赋值、取值
-
成员方法的作用:依然是执行
反射的作用
-
反射的作用
- 基本作用:可以得到一个类的全部成分然后操作
- 可以破坏封装性
- 可以绕过泛型的约束
- 最重要的用途是:适合做Java的框架,基本上,主流的框架都会基于反射设计出一些通用的功能
-
反射设计简易框架示例
-
只有反射得到Class对象才能知道对象有多少字段
框架
调用:
结果:
-
注解
-
注解概述
-
就是Java代码里的特殊标记,比如:
@Override
@Test
等,作用是:让其他程序根据注解信息来决定怎么执行该程序 -
注意:注解可以用在类上、构造器上、方法上、成员变量上、参数上,等位置处
-
自定义注解
-
就是自己定义注解
-
IDEA创建类时可以像创建接口一样直接选择创建注解(选Annotation)
-
注意定义属性时要加括号,和类不同
-
示例1:
-
特殊属性名:value
-
如果注解中只有一个value属性,没有其他非默认属性,使用注解时,value名称可以不写
-
注解的原理
- 注解本质十一个接口,Java中所有注解都是继承了Annotation接口的
@注解(...)
:其实就是一个实现类对象,实现了该注解以及Annotation接口
元注解
-
值得是:注解注解的注解
-
比如这里上面两个元注解是用来注解Test这个注解的注解
-
这两个注解的作用:
- 加逗号可以标注多个位置可用
- 一般用的是RUNTIME,保留到运行时
-
示例
-
注解的解析
-
就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来
-
如何解析注解?
-
指导思想:要解析谁上面的注解,就改先拿到谁
-
比如要解析类上面的注解,则应该先获取该类的Class对象,在过Class对象解析上面的注解
-
比如要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method 对象解析其上面的注解
-
Class、Method、Field、Constructor,都实现了AnnotatedElement接口,它们都拥有解析注解的能力
-
-
示例
作用、应用场景
-
注意:反射属于公用技术,支持泛型,但不建议加泛型(尖括号)
-
示例:自定义测试注解
- 注解内属性的作用:例如自定义测试注解,可以定义一个属性记录这个方法要测试几次
代理
代理是什么
-
对象如果嫌身上干的事太多的话,可以通过代理来转移部分责任
-
对象有什么方法想被代理,代理就一定要有对应的方法
-
终结如何知道要派有唱歌、跳舞方法的代理呢?
- 接口
-
如何实现?
- 定义接口,代理和被代理的都要实现接口
-
如何为Java对象创建一个代理对象?
-
java.lang.reflect.Proxy类:提供了为对象产生代理对象的方法
-
可以创建一个代理工具类用来创建代理时使用
-
使用时三个参数基本都是固定的,见下面示例
-
-
示例
-
StarService接口
-
Star类实现StarService接口
-
创建代理工具类
-
搭建框架
-
填充内容
-
-
主进程里创建代理对象
-
流程
-
代理用在什么地方
-
示例
-
增删改查和登录等功能都要统计该操作耗时,可以使用代理减少重复代码
AOP切面编程简谈
- 使用代理的例子就使用了切面编程的思想
- 在调用方法时,代理在代理方法的上下分别执行了一部分代码,在中间执行了方法中的代码