3.5Java语言的接口之注解类型(Annotation Types)

接口分为两种:普通接口(normal interfaces)和注解类型(annotation
types)。注解类型是一种特殊的接口类型。为了与普通接口区分开来,关键字interface的前面应该有一个@符号。

@interface

注解 是一种标记,它将信息与程序结构关联了起来,但是在运行时不会对程序产生直接影响。

注解有多种用途,其中包括:

  • 供编译器使用的信息编译器可以使用注解来检测错误或禁止显示警告。
  • 编译时和部署时处理-软件工具可以处理注释信息以生成代码,XML文件等。
  • 运行时处理-在运行时可以检查一些注解。

1.注解的格式

每个注解都具有下面这种格式,@符号告诉编译器后面跟随的是注解,元素的顺序无关紧要:

@AnnotationName(elementName1=value1, elementName2=value2,...)

1.1标记注解格式(marker annotation type)

如果注解中没有元素,则可以省略括号,如下面的@Override示例所示。

@Override
void mySuperMethod() { ... }

1.2单元素注解格式(single-element annotation type)

注解可以包含命名或未命名的元素(elements),并且这些元素具有值(value):

@Author(
   name = "Benjamin Franklin",
          //元素名为name,值为"Benjamin Franklin"
   date = "3/27/2003"
)
class MyClass() { ... }

或者

@SuppressWarnings(value =“ unchecked”)
    //没有元素名称的写法
void myMethod(){...}

如果只有一个名为value的元素(单元素注解single-element annotation type),则可以省略该名称,如下所示:

@SuppressWarnings("unchecked")
void myMethod() { ... }

1.3普通注解格式(normal annotation type)

下面的注解类型声明定义了一个具有若干个元素的注解类型:

@interface RequestForEnhancement {
int id(); // Unique ID number associated with RFE
String synopsis(); // Synopsis of RFE
String engineer(); // Name of engineer who implemented RFE
String date(); // Date RFE was implemented
}

1.4注解类型元素默认值

@interface RequestForEnhancementDefault {
int id(); // No default - must be specified in
// each annotation
String synopsis(); // No default - must be specified in
// each annotation
String engineer() default "[unassigned]";
String date() default "[unimplemented]";
}

1.5多个注解

也可以在同一声明上使用多个注解:

@Author(name = "Jane Doe")
@EBook
class MyClass { ... }

1.6多重注解(multiple annotations of the same type)

如果注解具有相同的类型,则称为多重注解:

@Author(name = "Jane Doe")
@Author(name = "John Smith")
class MyClass { ... }

2.注解使用场景

注解可以出现的场景分为两类:声明注解、类型注解。

2.1声明注解场景

声明注解是可以应用于声明的注解,该注解自己的类型可应用于该声明所表示的声明上下文中。

2.2类型注解场景

类型注解是可以应用于类型的注解,该注解自己的类型可应用于类型上下文中。

2.3判断注解场景

  • 如果该注解的类型在对应于该声明的声明上下文中可应用,并且在类型上下文不可应用,那么该注解就被认为只应用于该声明。
  • 如果该注解的类型在类型上下文中可应用,并且在对应于该声明的声明上下文中不可应用,那么该注解就被认为只应用于最靠近该注解的类型。
  • 如果该注解的类型在对应于该声明的声明上下文和在类型上下文中都可应用,那么注解就被认为同时应用于该声明和最靠近该注解的类型。

3.常见注解

3.1用于编译的注解

3.1.1@Deprecated(全部场景)

@Deprecated注解指示已标记的元素已弃用,不应再使用。每当程序使用带有@Deprecated注解的方法,类或字段时,编译器都会生成警告。不推荐使用元素时,还应使用Javadoc@deprecated标记对其进行记录,如以下示例所示。

  // Javadoc comment follows
    /**
     * @deprecated
     * explanation of why it was deprecated
     */
    @Deprecated
    static void deprecatedMethod() { }
}
3.1.2@SuppressWarnings(除了包和注解场景)

@SuppressWarnings注解告诉编译器禁止生成特定警告。在以下示例中,使用了不赞成使用的方法,并且编译器通常会生成警告。但是,在这种情况下,@SuppressWarnings会导致警告被抑制。

   // use a deprecated method and tell 
   // compiler not to generate a warning
   @SuppressWarnings("deprecation")
    void useDeprecatedMethod() {
        // deprecation warning
        // - suppressed
        objectOne.deprecatedMethod();
    }
3.1.3@override(只能方法场景)

@Override注解通知编译器该元素旨在覆盖超类中声明的元素。

  // mark method as a superclass method
   // that has been overridden
   @Override 
   int overriddenMethod() { }
3.1.4@Generated(全部场景)

@Generated注解的目的是供代码生成工具来使用,任何生成的源代码都可以被注解,从而与程序员提供的代码区分开来。

3.1.5@SafeVarargs(方法、构造器场景)

@SafeVarargs注解在应用于方法或构造函数时,断言该代码不会对其varargs参数执行潜在的不安全操作。

3.1.6@FuntionalInterface(接口场景)

@FuntionalInterface将接口标记为只有一个抽象方法的函数式接口。

3.2用于管理资源的注解

3.2.1@PostConstruct和@PreDestroy(方法场景)

@PostConstruct和@PreDestroy注解用于控制对象生命周期的环境中,例如Web容器和应用服务器。

3.2.2@Resource(类、接口、方法、域场景)

@Resource注解用于资源内注入。

3.3元注解

元注解就是适用于其他注解的注解,场景均为注解场景。

3.3.1@Target

@Target元注解可以应用于一个注解,以限制该注解可以应用到哪些项上。

3.3.2@Retention

@Retention元注解用于指定一条注解应该保留很长时间。

3.3.3@Documented

@Documented元注解为像Javadoc这样的归档工具提供了一些提示。

3.3.4@Inherited

@Inherited元注解只能应用于对类的注解。

3.3.5@Repeatable

@Repeatable注解表示可以将标记的注释多次应用于同一声明或类型使用。

3.3.6@Native

@Native 注解修饰成员变量,则表示这个变量可以被本地代码引用,常常被代码生成工具使用。对于 @Native 注解不常使用,了解即可。

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/java/javabasic/2508.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注