1: 注解:Annotation是一种应用于类、方法、参数、变量、构造器及包生命中的特殊修饰符,是一种由JSR-175标准选择用来描述代码的元数据。
Java中如下的4种注解,专门负责新注解的创建:
@Target - 注解应用于什么地方如果不明确指出,则改注解可以放在任何地方。
@Inherited - 是否允许子类继承该注解。
@Retention - 什么时候使用该注解定义该注解的生命周期;RetentionPolicy.CLASS表示在类加载的时候丢弃,在字节码文件的处理中有用,注解默认都使用这种方 式。RetentionPolicy.RUNTIME表示始终不对丢弃,运行期也保留该注释,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种 方式,比如spring的一些注解。
@Documented - 注解是否包含在JavaDoc中一个简单的标记注解,标识是否将注解信息添加在java文档中
java内置的常用注解:
@Override,表示当前的方法定义将覆盖超类中的方法。
@Deprecated,使用了注解为它的元素编译器将发出警告,因为注解@Deprecated是不赞成使用的代码,被弃用的代码。
@SuppressWarnings,关闭不当编译器警告信息。
自定义注解:
1 @Target(ElementType.METHOD) 2 @Retention(RetentionPolicy.RUNTIME) 3 public @interface Test { 4 5 }
除了@符号,注解很像是一个接口。定义注解的时候需要用到元注解,上面用到了@Target和@RetentionPolicy。
在注解中一般会有一些元素以表示某些值。注解的元素看起来就像接口的方法,唯一的区别在于可以为其制定默认值。没有元素的注解称为标记注解,上面的@Test就是一个标记注解。
在注解中一般会有一些元素以表示某些值。注解的元素看起来就像接口的方法,唯一的区别在于可以为其制定默认值。没有元素的注解称为标记注解,上面的@Test就是一个标记注解。
注解的可用的类型包括以下几种:所有基本类型、String、Class、enum、Annotation、以上类型的数组形式。元素不能有不确定的值,即要么有默认值,要么在使用注解的时候提供元素的值。而且元素不能使用null作为默认值。注解在只有一个元素且该元素的名称是value的情况下,在使用注解的时候可以省略“value=”,直接写需要的值即可。
使用注解最主要的部分在于对注解的处理,那么就会涉及到注解处理器。
从原理上讲,注解处理器就是通过反射机制获取被检查方法上的注解信息,然后根据注解元素的值进行特定的处理。
首先最重要的一点是:Annotation是被动的元数据,永远不会有主动行为
但凡Annotation起作用的场合都是有一个执行机制/调用者通过反射获得了这个元数据然后根据它采取行动。在你的例子里这个执行机制就是测试框架JUnit。你去 慢慢翻JUnit的代码一定能找到它去查询被调用的class有没有某某Annotation,然后如果有就怎么怎么样的代码