Java高级技术

单元测试

单元测试:针对最小的功能单元(方法),编写测试代码对其进行正确性测试。

Junit单元测试框架

Junit单元测试框架:可以用来对方法进行测试,它是第三方公司开源出来的(很多开发工具已经集成了Junit框架,比如IDEA)

优点:可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键完成对全部方法的自动化测试,且各自独立。不需要程序员去分析测试的结果,会自动生成测试报告出来。

需求:某个系统,有多个业务方法,请使用Junit单元测试框架,编写测试代码,完成对这些方法的正确性测试。

具体步骤

①将Junit框架的jar包导入到项目中 (注意:IDEA集成了Junit框架,不需要我们自己手工导入了)

②为需要测试的业务类,定义对应的测试类,并为每个业务方法,编写对应的测试方法(必须:公共、无参、无返回值)

③测试方法上必须声明@Test注解,然后在测试方法中,编写代码调用被测试的业务方法进行测试

④开始测试:选中测试方法,右键选择"JUnit运行",如果测试通过则是绿色;如果测试失败,则是红色

Junit单元测试框架的常用注解

Uunit 4.xxxx版本

|--------------|-----------------------------------|
| 注解 | 说明 |
| @Test | 测试类中的方法必须用它修饰才能成为测试方法,才能启动执行 |
| @Before | 用来修饰一个实例方法,该方法会在每一个测试方法执行之前执行一次。 |
| @After | 用来修饰一一个实例方法,该方法会在每一个测试方法执行之后执行一次。 |
| @BeforeClass | 用来修饰一个静态方法,该方法会在所有测试方法之前只执行一次。 |
| @AfterClass | 用来修饰一个静态方法,该方法会在所有测试方法之后只执行一次。 |

  • 在测试方法执行前执行的方法, 常用于初始化资源。
  • 在测试方法执行完后再执行的方法,常用于释放资源。

Uunit 5.xxxx版本

|------------|-----------------------------------|
| 注解 | 说明 |
| @Test | 测试类中的方法必须用它修饰才能成为测试方法,才能启动执行 |
| @Before | 用来修饰一个实例方法,该方法会在每一个测试方法执行之前执行一次。 |
| @AfterEach | 用来修饰一一个实例方法,该方法会在每一个测试方法执行之后执行一次。 |
| @BeforeAll | 用来修饰一个静态方法,该方法会在所有测试方法之前只执行一次。 |
| @AfterA11 | 用来修饰一个静态方法,该方法会在所有测试方法之后只执行一次。 |

  • 开始执行的方法:初始化资源。
  • 执行完之后的方法:释放资源。

反射

反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)

获取类的信息、操作它们

获取类

获取类的字节码Class对象有三种方式:

Class c1 = 类名.class

调用Class提供方法:public static Class forName(String className)

Object提供的方法:Class c3 =对象.getClass()

获取类的构造器

Class提供了从类中获取构造器Constructor对象的方法

|-----------------------------------------------------------------------|------------------------|
| 方法 | 说明 |
| Constructor<?>[ ] getConstructors() | 获取全部构造器(只能获取public修饰的) |
| Constructor<?>[ ] getDeclaredConstructors() | 获取全部构造器(只要存在就能拿到) |
| Constructor<T> getConstructor(Class<?>... parameterTypes) | 获取某个构造器(只能获取public修饰的) |
| Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) | 获取某个构造器( 只要存在就能拿到) |

获取类构造器的作用:初始化一个对象返回

|-----------------------------------------|--------------------------------------|
| Constructor提供的方法 | 说明 |
| T newInstance(Object... initargs) | 调用此构造器对象表示的构造器,并传入参数,完成对象的初始化并返回 |
| public void setAccessible(boolean flag) | 设置为true,表示禁止检查访问控制,可以直接访问私有构造器(暴力反射) |

获取类的成员变量

Class提供了从类中获取成员变量Field对象的方法

|--------------------------------------------|---------------------------|
| 方法 | 说明 |
| public Field[ ] getFields() | 获取类的全部成员变量(只能获取public修饰的) |
| public Field[ ] getDeclaredFields() | 获取类的全部成员变量(只要存在就能拿到) |
| public Field getField(String name ) | 获取类的某个成员变量(只能获取public修饰的) |
| public Field getDeclaredField(String name) | 获取类的某个成员变量(只要存在就能拿到) |

Field类可以对类的属性进行赋值和取值

|-----------------------------------------|--------------------------|
| 方法 | 说明 |
| void set(object obj,object value) | 赋值,需要指定要为哪个类赋值 |
| object get(object obj) | 取值,需要指定要取哪个类赋值 |
| public void setAccessible(boolean flag) | 设置为true,表示禁止检查访问控制(暴力反射) |

获取类的成员方法

Class提供了从类中获取成员变量Method对象的方法

|-----------------------------------------|--------------------------|
| 方法 | 说明 |
| void set(object obj,object value) | 赋值,需要指定要为哪个类赋值 |
| object get(object obj) | 取值,需要指定要取哪个类赋值 |
| public void setAccessible(boolean flag) | 设置为true,表示禁止检查访问控制(暴力反射) |

Method对象可以用来执行方法

|-------------------------------------------------|--------------------------|
| 方法 | 说明 |
| public object invoke(object obj,object... args) | 触发某个对象的该方法执行。 |
| public void setAccessible(boolean flag) | 设置为true,表示禁止检查访问控制(暴力反射) |

注解

注解就是Java代码里的特殊标记,比如:@Overide、@Test等。作用是:让其他程序根据注解信息来决定怎么执行该程序。

注解可以用在类上、构造器上、方法上、成员变量上、参数上、等位置处。

注解本质是一个接口,Java中所有注解都继承了Annotation接口

@注解(...):就是一个实现类对象,实现了该注解以及Annotation接口。

自定义注解

格式

public @interface 注解名称{

public 属性类型 属性名() [default 默认属性值];

}

特殊属性名:value

如果注解中只有一个value属性,使用注解时,value名称可以不写!!

元注解

元注解:修饰注解的注解,常用的有两个,分别是@Target和@Retention

@Target:声明被修饰的注解只能在哪些位置使用

@Target(ElementType.TYPE)

  1. TYPE,类,接口

  2. FIELD,成员变量

METHOD,成员方法

4.PARAMETER,方法参数

5.CONSTRUCTOR,构造器

6.LOCAL VARIABLE,局部变量

@Retention:声明注解的保留周期,

@Retention(RetentionPolicy.RUNTIME)

  1. SOURCE:只作用在源码阶段,字节码文件中不存在。

2.CLASS(默认值):保留到字节码文件阶段,运行阶段不存在

3.RUNTIME(开发常用):一直保留到运行阶段。

解析注解

Class 、Method、Field,Constructor、都实现了AnnotatedElement接口,它们都拥有解析注解的能力。AnnotatedElement接口提供了解析注解的方法

|-------------------------------------------------------------------------|-----------------|
| 方法 | 说明 |
| public Annotation[ ]getDeclaredAnnotations() | 获取当前对象上面的注解 |
| public TgetDeclaredAnnotation (Class<T>annotationClass) | 获取指定的注解对象 |
| public boolean isAnnotationPresent (class<Annotation>annotationClass) | 判断当前对象上是否存在某个注解 |

相关推荐
缘友一世8 分钟前
JAVA代理模式和适配器模式
java·代理模式·适配器模式
轻浮j11 分钟前
Sentinel底层原理以及使用算法
java·算法·sentinel
it噩梦11 分钟前
springboot 工程使用proguard混淆
java·spring boot·后端
潜意识起点14 分钟前
Java数组:静态初始化与动态初始化详解
java·开发语言·python
竹影卿心16 分钟前
Java连接HANA数据库
java·数据库·windows
Abelard_25 分钟前
LeetCode--347.前k个高频元素(使用优先队列解决)
java·算法·leetcode
海海不掉头发42 分钟前
软件工程-【软件项目管理】--期末复习题汇总
java·学习·产品运营·软件工程·团队开发·需求分析·期末复习
缘友一世1 小时前
java实现网络IO高并发编程java AIO
java·网络·python
CodeClimb1 小时前
【华为OD-E卷 - 猜字谜100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
ADRU1 小时前
设计模式-责任链模式
java·设计模式·责任链模式