假期学习21
第21天:注解(Annotation)
对应章节:第11章
(1)今天做了什么: 基本注解:@Override编译器检查是否重写成功;@Deprecated标记过时(调用产生警告);@SuppressWarnings({"unchecked","rawtypes"})压制指定类型警告。元注解:@Retention决定保留级别——SOURCE(编译丢弃)、CLASS(默认)、RUNTIME(最常用,运行时反射可读);@Target限定标注位置(TYPE类、METHOD方法、FIELD字段、PARAMETER参数等;@Documented纳入javadoc;@Inherited被子类继承。自定义注解:@interface MyAnnotation{String value();int timeout() default 0;}。通过Method.getAnnotation()和isAnnotationPresent()在运行时读取注解。练习:定义@Test注解(注解@Retention(RUNTIME)+@Target(METHOD)),用反射扫描方法并执行被标记的方法——实现了JUnit的核心原理雏形。
(2)明天准备做什么: 进入第12章IO流前半部分——File类操作文件和目录,字节流InputStream/OutputStream体系,FileInputStream/FileOutputStream基础读写,BufferedInputStream/BufferedOutputStream缓冲区加速。练习实现含进度显示的文件复制和递归遍历目录。
(3)遇到的问题: 注解属性类型有限制——只能是基本类型、String、Class、枚举、注解,不能是自定义对象。默认值不能为null(除String默认可为""外)。反射读取注解时发现没读到——因为自定义注解的@Retention忘了设为RUNTIME,默认为CLASS级别导致运行时已丢失。练习中的"单元测试框架"通过反射invoke调用方法时,如果方法抛出异常需要用InvocationTargetException.getCause()获取原始异常。
浙公网安备 33010602011771号