完整的Java注解教程

注解是一种元数据,其可在对于Java源代码的各种元件被施加在Java以便以后一些工具,调试器或应用程序可以利用这些注解; 并以积极和建设性的方式帮助分析该计划。只需提一下,我们就可以用一个词或几乎所有内容注解Java或Java中的类,方法,变量,参数和包。了解应用在Java源代码上的注解与其他类成员一起编译为字节码很重要,并且使用反射程序员可以查询此元数据信息,以确定在任何特定上下文中执行的适当操作。

在本教程中,我将讨论所有重要的概念,您应该随时注意这些概念,以充分利用Java语言的这一出色功能。

讨论要点

历史和Java注解概述
BUILT_IN注解中的Java 
	注解应用到其它注解
		@Retention 
		@Documented 	
		@Target 
		@Inherited 
		@Repeatable 
	注解应用Java代码
		@Override 
		@Deprecated 
		@SuppressWarnings 
		@SafeVarargs 
		@FunctionalInterface 
定制标注在Java中
	创建定制标注
	使用自定义注解
使用反射
摘要处理注解

Java注解的历史和概述

在Java中,注解是通过JSR 175引入的,称为“元数据工具” 。JSR描述指出其目的是:

“ Java-TM编程语言的元数据工具将允许将类,接口,字段和方法标记为具有特定属性”。

我们多次谈论元数据。Java语言上下文中的元数据是什么?我们为什么还要关心它们?让我们通过一个例子来理解元数据的需求。

下面是声明为final的类的源代码:

public final class MyFinalClass{
    //other class members
}

现在,我们在类声明中使用了“ final”关键字。此声明的影响是您不能扩展此类或使其成为子类。编译器如何理解这一点?只是因为有’ final ‘关键字。对?好吧,这称为元数据。

元数据是关于数据的数据。元数据会在您的实际数据上添加一些其他标志(例如,在上述情况下为MyFinalClass类),并且在运行时,您或了解这些标志的JVM可以利用此元数据信息来根据上下文做出适当的决策。

在Java中,我们使用注解来表示元数据。我们可以注解类,接口,方法,参数,甚至包。通常,我们必须在运行时利用这些注解表示的元数据信息。

Java内置注解

显然,您可以定义自己的注解,但是Java确实也提供了一些内置注解供现成的使用。在本节中,我们将学习这些内置注解及其详细用法。

在继续之前,重要的是要提醒注解是元数据,它们可以应用于源代码的任何部分,甚至也可以应用于其他注解。我将首先讨论应该应用于其他注解的注解,因为当我们开始讨论适用于Java源代码的注解时,它将更有意义。

注解应用于其他注解

通常在下面讨论的其他注解中使用五个注解来提示编译器JVM应该如何处理新注解。让我们一一探讨这5个注解。

@保留

此注解指定如何在Java运行时中存储标记的注解。无论是仅限于源代码,嵌入到生成的类文件中,还是在运行时也可以通过反射使用。

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//@Retention(RetentionPolicy.CLASS)
@Retention(RetentionPolicy.RUNTIME)
//@Retention(RetentionPolicy.SOURCE)
public @interface MyCustomAnnotation
{
    //some code
}

@记录

此注解指示应将新注解包含在由Java文档生成器工具生成的Java文档中。

import java.lang.annotation.Documented;
@Documented
public @interface MyCustomAnnotation {
   //Some other code
}

@目标

使用@Target注解可以限制在某些Java元素(例如类,接口或方法)上使用新注解。指定目标后,您将只能在给定的元素上使用新的注解。

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(value = {ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR,
                 ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.LOCAL_VARIABLE,
                 ElementType.PACKAGE, ElementType.PARAMETER})
public @interface MyCustomAnnotation {
   //Some other code
}

@遗传

当您将此注解应用到任何其他注解时,即@MyCustomAnnotation;并且@MyCustomAnnotation适用于任何类别,MyParentClass那么该类别的@MyCustomAnnotation所有子类别也将可用MyParentClass。从本质上讲,这意味着当您尝试@MyCustomAnnotation在任何类X上查找注解时,都会查询X到n级的所有父类@MyCustomAnnotation。如果注解存在于任何级别,则结果为true,否则为false。

请注意,默认情况下,应用于父类的注解不适用于子类。

import java.lang.annotation.Inherited;
@Inherited
public @interface MyCustomAnnotation {
   //Some other code
}

@可重复

默认情况下,注解仅在Java元素上应用一次。但是,根据任何要求,您必须多次应用注解,然后@Repeatable在新注解上使用注解。

@Repeatable已在最新的Java 8版本中添加。

@Repeatable(Schedules.class)
public @interface Schedule { ... }

现在使用上面的注解,如下所示:

@Schedule(dayOfMonth="last")
@Schedule(dayOfWeek="Fri", hour="23")
public void doPeriodicCleanup() { ... }

适用于Java代码的注解

到目前为止,我们了解了

saigon has written 1440 articles

Leave a Reply