高级 - java
单元测试
- 针对最小的功能单元(方法),编写测试代码对其进行正确性的测试。
junit单元测试框架
- 可以用于对方法进行测试,它是第三方公司开源出来的。
优点
- 可以灵活编写代码,可以针对某个方法测试,也可以一键测试全部
- 会有测试报告
具体步骤
将Junit框架的jar包导入到项目中(注意:IDEA集成了Junit框架,不需要我们自己手工导入了)
为需要测试的业务类,定义对应的测试类,并为每个业务方法,编写对应的测试方法(必须:公共、无参、无返回值)
测试方法上必须声明@Test注解,然后在测试方法中,编写代码调用被测试的业务方法进行测试
开始测试:选中测试方法,右键选择“Junit运行”,如果测试通过则是绿色;如果测试失败,则是红色
断言机制
- 通过预测结果来检查bug
常见注解
@Test
@Before
5版本@BeforeEach
修饰实例方法,会在每个测试方法执行前执行一次@After
5版本@AfterEach
修饰实例方法,会在每个测试方法执行后执行一次@BeforeClass
5版本@BeforeAll
修饰静态方法,会在所有测试方法执行前只执行一次@AfterClass
5版本@AfterAll
修饰静态方法,会在所有测试方法执行后只执行一次
反射
- 加载类,并允许以编程的方式解剖类中的各种成分(成员变量,方法,构造器等)。
获取Class对象的三种方式
Class c1 = 类名.class
- 调用Class提供方法:
public static Class forName(String package);
- Object 提供的方法
public Class getClass();
Class c3 = 对象.getClass();
获取类的构造器
方法 | 说明 |
---|---|
Constructor<?>[] getConstructors() |
获得全部构造器(public修饰的) |
Constructor<?>[] getDeclaredConstructors() |
获得全部构造器 |
Constructor<?> getConstructor(参数类型) |
获取某个构造器(public修饰的) |
Constructor<?> getDeclaredConstructor(参数类型) |
获取某个构造器 |
作用
初始化对象返回
T newInstance(Object... initargs)
public void setAccessible(boolean flag)
设置为true可以暴力反射,会破坏封装性。
获取成员变量
方法 | 说明 |
---|---|
public Field[] getFields() |
获得全部成员变量(public修饰的) |
public Field[] getDeclaredFields() |
获得全部成员变量 |
public Field getField(String name) |
获取某个成员变量(public修饰的) |
public Field geDeclaredtField(String name) |
获取某个成员变量 |
作用
赋值取值
void set(Object obj, Object value)
Object get(Object obj)
public void setAccessible(boolean flag)
设置为true可以暴力反射,会破坏封装性。
获取成员方法
Method[] getMethods()
Method getMethod(String name, Class<?>... parameterTypes)
作用
执行
public Object invoke(Object obj, Object...args)
public void setAccessible(boolean flag)
设置为true可以暴力反射,会破坏封装性。
作用
- 基本作用:得到一个类的全部成分然后操作
- 可以破坏封装性
- 适合做java的框架
注解
- java代码里的特殊标记,比如
@Override
@Test
- 让程序根据注解信息来决定怎么执行该程序
- 可以用在类上,构造器上,方法上,成员变量上,参数上等
- 本质 是一个接口,继承Annotation
- @是一个实现类,实现了注解
自定义注解
1 | public 注解名称{ |
- 特殊属性 value 如果只有这一个属性需要填,可以省略属姓名
元注解
- 修饰注解的注解
@Target
- 声明被修饰的注解只能用在什么地方
@Target(ElementTyoe.Type)
- TYPE 类,接口
- FIELD 成员变量
- METHOD 成员方法
- PARAMETER 方法参数
- CONSTRUCTOR 构造器
- LOCAL_VARIABLE 局部变量
@Retention
- 声明注解的保留周期
@Retention(RetentionPolicy.RUNTIME)
- SOURCE 只作用在源码阶段
- CLASS 默认 保留到字节码阶段
- RUNTIME 开发常用 一直保留到运行阶段
注解的解析
- 判断是否存在注解,并把注解中的内容解析出来
- 指导思想:要解析谁上面的注解,就应该先拿到谁。
- Class、Method、Field、Constructor都实现了AnnotatedElement接口,它们都拥有解析注解的能力。
- getDeclareAnnotations() 获取当前对象的所有注解
- getDeclareAnnotation(注解类) 获取当前对象的某个注解
- isAnnotationPresent(注解类)判断某个注解是否存在
动态代理
- 通过代理转移部分职责
- 类似于装饰器模式,给对现有的功能进行扩展而不修改源代码
- 对于重复代码可以往上面提一层,对每个方法都进行处理
Porxy.newProxyInstance
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 White Horse Village!