使用注解格式
注解的格式,通常情况下使用@符号开始,后面跟上对应的注解名称,以及注解参数和对应的值。
@注解名称([{ 标识符 = 元素的值,
标识符 = {元素的值, 元素的值, 元素的值},
标识符 = Annotation
}])
定义注解格式
修饰符 @interface 注解名称{
[注解的方法参数]
}
以及 API 的描述,对于注解的实现。通常分为三种,第一种是最通用的。其他的都是第一种的简写
方式。
- 标准的注解( NormalAnnotation )举例: @TypeName(value=ElementValue)
- 标记注解( MarkerAnnotation ) 举例:@TypeName
- 单元素注解( SingleElementAnnotation ) 举例:@TypeName(ElementValue)
Annotation 接口
在 Java 中,Annotation 接口是所有元注解接口扩展的通用接口。所有的注解都隐式的扩展自该接
口。但是需要注意的,继承和实现该接口并不能实现定义注解接口。并且该接口并没有定义成一个注解
接口。
public interface Annotation
对于 java.lang.annotation 包中, 元注解接口有以下类:
内置注解
Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。
作用在代码的注解是
@Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
@Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
@SuppressWarnings - 指示编译器去忽略注解中声明的警告。
作用在其他注解的注解(或者说 元注解)是:
内置注解:@Override @Deprecated @SuppressWarnings @FunctionalInterface @SafeVarargs
元注解
@Documented -- @Documented 所标注内容,可以出现在javadoc中。
@Inherited -- @Inherited只能被用来标注“Annotation类型”,它所标注的Annotation具有 继承性。
@Retention -- @Retention只能被用来标注“Annotation类型”,而且它被用来指定 Annotation的RetentionPolicy属性。
@Target -- @Target只能被用来标注“Annotation类型”,而且它被用来指定Annotation的 ElementType属性。
@Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以 通过反射访问。
@Documented - 标记这些注解是否包含在用户文档中出现(javadoc)。
@Target - 标记这个注解应该是哪种 Java 成员。
@Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)
@Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。
自定义注解
示例:
//AnnotationTest.class
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
@Ann(name = "李四", value = 18, sex = "男")
public class AnnotationTest {
@Ann(name = "李强", value = 88)
public static void main(String[] args) throws NoSuchMethodException {
var me = AnnotationTest.class;
var m = me.getMethod("main", String[].class).getAnnotation(Ann.class);
System.out.println(m);
System.out.println(m.sex());
System.out.println(m.name());
System.out.println(m.value());
if (me.isAnnotationPresent(Ann.class)) {
var an = (Ann) me.getAnnotation(Ann.class);
System.out.println(an.sex());
System.out.println(an.value());
System.out.println(an.name());
}
}
}
/* TYPE是类上 METHOD是方法 */
@Retention(RUNTIME)
@Target({TYPE, METHOD})
@interface Ann {
String name();
int value();
String sex() default "女";
}
//自定义Anns注解
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Retention(RUNTIME)
@Target({TYPE, METHOD})
@interface Anns {
Ann[] value();
}
//自定义Ann注解
@Repeatable(Anns.class)
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface Ann {
String name();
int age() default 18;
String sex() default "男";
}