黑马程序员技术交流社区

标题: [石家庄校区]就业班JavaSE高级部分day14 Junit 反射 注解 [打印本页]

作者: 湿漉漉的文字控    时间: 2018-12-2 15:20
标题: [石家庄校区]就业班JavaSE高级部分day14 Junit 反射 注解
就业班JavaSE高级部分day14 Junit 反射 注解

JUnit:单元测试
Junit:测试概念
测试代码是否正确,能否达到预期效果
分类:
黑盒测试: 不需要写代码 给定输入值 看程序是否能输出期望的值
白盒测试: 需要写代码, 关注程序的具体执行流程
反射: 框架设计的灵魂
框架: 半成品软件, 可以在框架的基础上进行软件开发,简化代码
反射: 将类的个个组成部分封装成其他对象,成为反射机制
好处:
在程序的运行过程中, 操作这些对象
可以解耦,降低程序的耦合性, 提高程序的可扩展性
C:/Users/Administrator/AppData/Local/YNote/data/weixinobU7VjkOlFOSrTPAb-ROkG2i_vds/e5c7c2cf4be3478aae7435ca45803b84/6995398433394c15a462e3ab22a578c2.jpg
获得Class对象的方式:
Source源代码阶段: Class.forName("类名+包名") (将字节码文件加载到内存,返回Class文件)
多用于配置文件
Class类对象阶段: 类名.class(通过类名的属性class获取)
多用于参数传递
RunTime运行时阶段: 对象.getClass(getClass()方法在Object中定义)
多用于获取字节码对象
同一个字节码文件(*.class)文件在一次程序运行中,只会被加载一次, 不论通过哪种方式获取
Class文件对象和都是同一个
使用Class对象功能:
获取的功能
获取成员变量们
获取所有的成员变量
Field[] getFields(): 获取所有 public 的成员变量
Field getField(String name): 获取指定名称的 public 的成员变量
Field[] getDeclaredFields(): 获取所有的成员变量, 不考虑权限修饰符
Field getDeclaredField(String name): 获取指定名称的成员变量, 不考虑权限修饰符
获取构造方法们
Constructor<?>[] getConstructors(): 获取所有 public 的构造方法
Constructor<T> getConstructor(Class<?>... parameterTypes): 获取指定的 public
构造方法
Constructor<?>[] getDeclaredConstructors(): 获取所有的构造方法, 不考虑权限修
饰符
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes): 获取指定
的构造方法, 不考虑权限修饰符
获取成员方法们
Method[] getMethods(): 获取所有 public 的成员方法
Method getMethod(String name, Class<?>... parameterTypes) : 获取指定的
public 成员方法
Method[] getDeclaredMethods(): 获取所有的成员方法, 不考虑权限修饰符
Method getDeclaredMethod(String name, Class<?>... parameterTypes): 获取指定
的成员方法, 不考虑权限修饰符
获取类名
String getName(): 获取当前Class对象代表的类的全类名
// 其他
        T newInstance(): 使用当前类的空参构造创建一个对象
        A getAnnotation(Class<A> annotationClass): 获取当前类的注解对象
        ClassLoader getClassLoader(): 返回该类的类加载器
.            

注解:
注解: Annotation
    JDK 1.5 引入. 也叫元数据, 是一种代码级别的说明
    它可以声明在包, , 字段(成员变量), 方法, 局部变量, 方法参数等的前面, 用来对这些元素进行说明
注解: 说明程序的。给计算机看的
注释: 用文字描述程序的。给程序员看的
使用注解: @注解名称
作用分类:
    1. 编写文档: 通过代码里标识的注解生成文档
        (生成API文档 @author @version @since @param @return)
    2. 代码分析: 通过代码里标识的注解对代码进行分析 (使用反射)
        (JUnit提供的 @Test @Before @After)
    3. 编译检查: 通过代码里标识的注解让编译器能够实现基本的编译检查
        (@Override @FunctionalInterface)
JDK内置注解
JDK中预定义的一些注解:
    @Override: 检测被该注解标注的方法是否是"重写"父类(接口)
    @Deprecated: 该注解标注的内容,表示已过时
    @SuppressWarnings: 压制警告. 一般传递参数all  @SuppressWarnings("all")
自定义注解: 格式和本质
public interface 接口名 {}
自定义注解格式:关键字 @interface
    元注解
    public @interface 注解名称 {
        属性; (接口中的抽象方法)
        属性;
        属性;
        ...     
    }​
@注解名称  
注解的本质:
    注解本质上就是一个接口,该接口默认继承Annotation接口
    public interface MyAnno extends java.lang.annotation.Annotation {}
自定义注解: 属性定义
属性:
    接口中的"抽象方法"   
属性的要求:
    1. 属性的"返回值类型"可以是以下类型:
        基本数据类型(8)
        String
        枚举
        注解
        以上类型的数组
    2. 定义了属性,在使用注解时, 需要"给属性赋值" (其实是抽象方法的返回值)
        1. 属性使用 default 关键字指定默认值, 则可以不赋值
        2. 如果只有一个名为"value"的属性需要赋值, value 可以省略, 直接写值即可
        3. 给数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略
自定义注解: 元注解
元注解:
    用于描述注解的注解   
常用元注解:
    @Target: 描述注解能够作用的位置
        ElementType枚举的常用取值:
            TYPE:可以作用于类上
            METHOD:可以作用于方法上
            FIELD:可以作用于成员变量上
        示例: @Target(value = {ElementType.TYPE, ElementType.METHOD})
    @Retention: 描述注解被保留的阶段
        RetentionPolicy枚举的取值:
            SOURCE: 保留到源代码阶段
            CLASS: 保留到类对象阶段
            RUNTIME: 保留到运行时阶段
        示例: @Retention(RetentionPolicy.RUNTIME):保留注解到class字节码文件中并被JVM读取到
    @Documented: 加上后, 当前注解会被抽取到api文档中
    @Inherited: 加上后, 当前注解会被子类继承
自定义注解: 解析注解
获取注解属性值的步骤:
    1. 获取注解定义位置的对象 (Class对象(类注解), Field对象(成员变量注解), Method对象(方法注解))
    2. 调用 ProAnno a = cls.getAnnotation(ProAnno.class) 方法获取注解对象
    3. 通过注解对象调用抽象方法获取属性值
    // 比如获取一个类上的注解
    注解类型 注解变量名 = 被注解的类.class.getAnnotation(注解名.class);
    数据类型 变量名 = 注解变量名.抽象方法();
    ProAnno proAnno = Test.class.getAnnotation(ProAnno.class);
    String className = proAnno.className();
    String methodName = proAnno.methodName();






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2