专业的JAVA编程教程与资源

网站首页 > java教程 正文

学习廖雪峰的JAVA教程---注解(定义注解@interface)

temp10 2024-09-27 23:03:20 java教程 6 ℃ 0 评论

Java语言使用@interface语法来定义注解(Annotation),它的格式如下:

public @interface Report {
 int type() default 0;
 String level() default "info";
 String value() default "";
}

注解的参数类似无参数方法,可以用default设定一个默认值(强烈推荐)。最常用的参数应当命名为value。

学习廖雪峰的JAVA教程---注解(定义注解@interface)

元注解

有一些注解可以修饰其他注解,这些注解就称为元注解(meta annotation)。Java标准库已经定义了一些元注解,我们只需要使用元注解,通常不需要自己去编写元注解。

@Target

最常用的元注解是@Target。使用@Target可以定义Annotation能够被应用于源码的哪些位置:

  • 类或接口:ElementType.TYPE;
  • 字段:ElementType.FIELD;
  • 方法:ElementType.METHOD;
  • 构造方法:ElementType.CONSTRUCTOR;
  • 方法参数:ElementType.PARAMETER。

例如,定义注解@Report可用在方法上,我们必须添加一个@Target(ElementType.METHOD):

@Target(ElementType.METHOD)
public @interface Report {
 int type() default 0;
 String level() default "info";
 String value() default "";
}

例如,定义注解@Report可用在方法上,我们必须添加一个@Target(ElementType.METHOD):

@Target(ElementType.METHOD)
public @interface Report {
 int type() default 0;
 String level() default "info";
 String value() default "";
}

定义注解@Report可用在方法或字段上,可以把@Target注解参数变为数组{ ElementType.METHOD, ElementType.FIELD }:

@Target({
 ElementType.METHOD,
 ElementType.FIELD
})
public @interface Report {
 ...
}

实际上@Target定义的value是ElementType[]数组,只有一个元素时,可以省略数组的写法。

@Repeatable

使用@Repeatable这个元注解可以定义Annotation是否可重复。这个注解应用不是特别广泛。

@Repeatable
@Target(ElementType.TYPE)
public @interface Report {
 int type() default 0;
 String level() default "info";
 String value() default "";
}

经过@Repeatable修饰后,在某个类型声明处,就可以添加多个@Report注解:

@Report(type=1, level="debug")
@Report(type=2, level="warning")
public class Hello {
}

@Inherited

使用@Inherited定义子类是否可继承父类定义的Annotation。@Inherited仅针对@Target(ElementType.TYPE)类型的annotation有效,并且仅针对class的继承,对interface的继承无效:

@Inherited
@Target(ElementType.TYPE)
public @interface Report {
 int type() default 0;
 String level() default "info";
 String value() default "";
}

在使用的时候,如果一个类用到了@Report:

@Report(type=1)
public class Person {
}

则它的子类默认也定义了该注解:

public class Student extends Person {
}

Java使用@interface定义注解:

可定义多个参数和默认值,核心参数使用value名称;

必须设置@Target来指定Annotation可以应用的范围;

应当设置@Retention(RetentionPolicy.RUNTIME)便于运行期读取该Annotation。

【关键:

  1. 注解的参数类似无参数方法,可以用default设定一个默认值(强烈推荐)
  2. 实际上@Target定义的value是ElementType[]数组,只有一个元素时,可以省略数组的写法
  3. 必须设置@Target和@Retention,@Retention一般设置为RUNTIME,因为我们自定义的注解通常要求在运行期读取。一般情况下,不必写@Inherited和@Repeatable
  4. Java使用@interface定义注解
public @interface Report {
 int type() default 0;
 String level() default "info";
 String value() default "";
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表