Java注解,也称为标注(Annotation),是JDK5.0引入的一种标记机制,用于为代码中的类、方法、字段、参数等提供元数据,这些元数据可以被编译器、工具或运行时环境使用。注解提供了一种灵活的方式来标记代码,从而可以在编译时或运行时进行代码分析、验证或修改。
注解的基本概念
注解的类型
注解类型是一个接口,使用@interface
关键字定义。
注解类型可以有成员,成员的默认值可以使用default
关键字指定。
注解实例是注解类型的实例,可以附加到类、方法、字段或参数等程序元素上。
注解实例由注解类型和成员值组成。
java
// 定义注解类型
@Retention(RetentionPolicy.RUNTIME) // 元注解,指定注解保留策略
@Target({ElementType.METHOD, ElementType.TYPE}) // 元注解,指定注解可以应用的目标
@interface Author {
String name() default "Unknown"; // 注解成员,指定默认值
String date(); // 注解成员,没有默认值,使用时必须指定
}
注解的分类
标准注解
- @Override
- 功能:该注解用于标记某个方法是重写父类或接口中的方法。如果标记的方法并没有真正重写父类或接口中的方法,编译器会报错。
- 应用场景:通常用于指示方法是复写父类或接口中的方法,确保方法正确实现。
- @Deprecated
- 功能:该注解用于标记某个类、方法或字段已经过时,不建议使用。编译器在遇到被@Deprecated标记的代码时会发出警告。
- 应用场景:主要用于提示开发者某些类或方法已不再推荐使用,可能需要替换或更新。
- @SuppressWarnings
- 功能:该注解用于抑制编译器产生的特定警告。可以指定抑制的警告类型,如“unchecked”、“rawtypes”等。
- 应用场景:当代码不得不违反某些编程规范但又不影响运行时安全时,可以使用此注解来屏蔽警告。
- @FunctionalInterface
- 功能:该注解用于标记一个接口是函数式接口,即该接口中有且仅有一个抽象方法。如果接口不符合这一条件,编译器会报错。
- 应用场景:主要用于支持Lambda表达式和函数式编程,确保接口设计符合函数式接口的要求。
元注解
元注解是Java中用于定义其他注解的注解,它们决定了自定义注解的作用范围和继承特性。
- @Retention
- 功能:该注解用于指定被修饰的注解保留的时间范围,即注解信息在哪个阶段依然有效。
- 参数:
RetentionPolicy.SOURCE
:注解仅存在于源代码中,编译后会被移除。RetentionPolicy.CLASS
:注解会被编译到.class
文件中,但 JVM 无法访问。RetentionPolicy.RUNTIME
:注解会被编译到.class
文件中,并且可以通过反射在运行时访问。
- 应用场景:通常用于指定自定义注解的保留策略,如SOURCE、CLASS或RUNTIME。
- @Target
- 功能:该注解描述了被修饰的注解能够用于哪些Java成员上,如类、方法、字段等。
- 参数:
ElementType.TYPE
:可以应用于类、接口或枚举。ElementType.FIELD
:可以应用于字段。ElementType.METHOD
:可以应用于方法。ElementType.PARAMETER
:可以应用于方法参数。ElementType.CONSTRUCTOR
:可以应用于构造器。ElementType.LOCAL_VARIABLE
:可以应用于局部变量。ElementType.ANNOTATION_TYPE
:可以应用于注解类型。ElementType.PACKAGE
:可以应用于包声明。ElementType.TYPE_PARAMETER
:可以应用于类型参数。ElementType.TYPE_USE
:可以应用于类型使用的地方。
- 应用场景:用于限制自定义注解的使用范围,确保其在合适的Java成员上应用。
- @Documented
- 功能:该注解表明被修饰的注解应该被JavaDoc工具记录,包含在生成的文档中。
- 应用场景:主要用于需要生成API文档的场合,使得注解信息能够出现在文档中。
- @Inherited
- 功能:该注解表示被修饰的注解具有继承性,当一个超类被该注解修饰,其子类也会继承这个注解。
- 应用场景:用于设计那些需要被子类继承的注解,例如在某些框架中指示配置信息的注解。
- @Repeatable
- 功能:Java 8新增的注解,用于指示自定义注解可以在同一个声明上重复使用多次。
- 应用场景:用于设计可重复使用的注解,避免同一个位置上只能出现一次的限制。
自定义注解
开发者可以根据需要自定义注解,通过定义使用@interface关键字定义新的注解类型。
注解的使用
- 声明注解:使用
@interface
关键字来声明一个注解。
java
@interface MyAnnotation {
String value() default "default value";
}
- 使用注解:将声明的注解应用到类、方法、字段或参数上。
java
public class MyClass {
@MyAnnotation("some value")
public void myMethod() {
// method body
}
}