单元测试

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

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
2
3
4
5
6
7
8
9
10
public @interface 注解名称{
public 属性类型 属性名() default 默认值;
}

public @interface Mytest{
public String a();
public boolean b() default true;
}

@Mytest(a = "sss")
  • 特殊属性 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