1. 注解的概念
- Annotation 是从 JDK 5.0 开始引入的新技术。
- Annotation 的作用
- 不是程序本身,可以对程序作出解释,这一点和注释(comment)没什么区别。
- 可以被其他程序(比如:编译器等)读取。
- Annotation的格式
- @注解名
- @注解名(value = “参数值”)
- Annotation 的使用场合
- 在package、class、method、field 等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问。
2. 注解的分类
-
Java 内置 7 个注解,3 个在
java.lang
中,4 个在java.lang.annotation
中。-
作用在类、变量或方法的注解:
-
@Override
- 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。@Override public String toString(){ return super.toString(); }
-
@Deprecated
- 标记过时方法。该方法不推荐使用,但是可以使用,或者说有更好比它的方法。@Deprecated public static void test(){ System.out.println("Deprecated"); } public static void main(String[] args) { //在 IDEA 中 test 是带有删除线的,表示其是过时方法 test(); }
-
@SuppressWarnings
- 指示编译器去忽略注解中声明的警告。//参数 all 是忽略所有类型的警告,unchecked 用于抑制未检查的警告 @SuppressWarnings("all") public void test(){ //list 是一个未使用的变量,在 IDEA 中是灰色,忽略这个警告后变为正常颜色。 List list = new ArrayList(); }
-
-
作用在其他注解的注解,或者说元注解(meta-annotation):
-
@Retention
- 标识这个注解怎么保存,是只在代码中,还是编入class
文件中,或者是在运行时可以通过反射访问,一般都选择RUNTIME
(SOURCE
<CLASS
<RUNTIME
) 。@Retention(value = RetentionPolicy.RUNTIME) @interface Myannotation{ }
-
@Documented
- 标记这些注解是否包含在用户文档中。@Documented @interface Myannotation{ }
-
@Target
- 标记这个注解应该是哪种 Java 成员。public class metaTest { @Myannotation public void test(){ } } //自定义一个可注解函数的注解 @Target(value = ElementType.METHOD) @interface Myannotation{ } /** * ElementType 为一个枚举类型数据,元素如下 * TYPE 意味着,它能标注"类、接口(包括注释类型)或枚举声明"。 * FIELD 意味着,它能标注"字段声明"。 * METHOD 意味着,它能标注"方法"。 * PARAMETER 意味着,它能标注"参数"。 * CONSTRUCTOR 意味着,它能标注"构造方法"。 * LOCAL_VARIABLE 意味着,它能标注"局部变量"。 * ANNOTATION_TYPE 意味着,它能标注"注解"。 * PACKAGE 意味着,它能标注"包"。 * TYPE_PARAMETER 1.8 版本新加入的参数。 * TYPE_USE 1.8 版本新加入的参数。 */
-
@Inherited
- 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)。@Inherited @interface Myannotation{ }
-
-
-
Java 7 额外添的 3 个注解:
-
@SafeVarargs
- Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。 -
@FunctionalInterface
- Java 8 开始支持,标识一个匿名函数或函数式接口。 -
@Repeatable
- Java 8 开始支持,标识某注解可以在同一个声明上使用多次
-
-
自定义注解
-
Java 可使用
@interface
自定义注解。public class customTest { /** * 有默认值的参数可以不赋值 * 没有默认值的参数必须赋值 * 若只有一个参数,设置其为 value 不设置默认值,也可以不赋值 */ @Myannotation(id = 1, name = "why", age = 10, school = "加里敦") public void test(){} } //自定义一个注解 @Target(value = ElementType.METHOD) @Retention(value = RetentionPolicy.RUNTIME) @interface Myannotation{ //注解参数:参数类型 参数名() 默认值 ×××; int id() default -1; String name() default ""; int age() default 0; String school() default ""; }
-