JAVA注解

Java注解Annotations主要用于为目标程序提供额外补充的说明信息。

  • 注解以@符号标识
  • 注解并不改变编译程序的行为
  • 注意可以为程序元素:实例变量、构造方法、方法或者类添加元数据信息
  • 注解并不是单纯的注释,但却可以修改编译器如何来处理目标程序

下面我们举例说明,为什么说注解并非单纯的注解,下面这段代码将抛出编译错误,因为我们使用了@Override注解,但却没有Override重写父类方法,而是重载Overload父类方法,因此编译器将抛出编译异常

/* Java program to demonstrate that annotations are 
not barely comments (This program throws compiler 
error because we have mentioned override, but not 
overridden, we haver overloaded display) */
class Base 
{ 
	public void display() 
	{ 
		System.out.println("Base display()"); 
	} 
} 
class Derived extends Base 
{ 
	@Override
	public void display(int x) 
	{ 
		System.out.println("Derived display(int )"); 
	} 

	public static void main(String args[]) 
	{ 
		Derived obj = new Derived(); 
		obj.display(); 
	} 
}

10: error: method does not override or implement
a method from a supertype

注解的种类

Java中包含三种类型的注解

  • Marker Annotations:标识符注解,主要用于标识声明,此类注解不包含任何成员及数据信息,@Override 就是一个标识符注解。

@Override

  • Single value Annotations:单值注解,此类注解仅包含一个成员属性,并且允许方便的来指定成员属性值,当我们使用注解时,仅需要指定成员属性值,而无需指定成员属性的名称,当然前提是成员的名称必须为value

@AnnotationName(“elementValue”)

  • Full Annotations:注解包含多个元素

@AnnotationName(element1 = “value1”, element2 = “value2”)

注解的使用位置

  • 元素定义或者声明

注解可用于放在类、方法、接口、成员变量或者其他代码元素上

看下面一个例子@SuppressWarnings,方法注解的场景

import java.util.*;

class Main {
  @SuppressWarnings("unchecked")
  static void wordsList() {
    ArrayList wordList = new ArrayList<>();

// This causes an unchecked warning
    wordList.add("programiz"); 

    System.out.println("Word list => " + wordList);
  }

  public static void main(String args[]) {
    wordsList();
  }
}

程序输出如下:

Word list => [programiz]

@SuppressWarnings注解主要是告诉编译器忽略警告,如果我们不使用这个注解,因为我们没有定义数组链表数据类型,那么编译器就会抛出下面的警告

Main.java uses unchecked or unsafe operations

  • 类型注解

在Java 8 之前,注解只能用于元素声明,JDK8 引入了数据类型注解,也就是说,当我们在使用某个数据类型时,也可注解标识

  • 比如,构造函数调用

new @Readonly ArrayList<>()

  • 比如,数据类型定义

@NonNull String str;

定义了一个非空的字符串变量,以避免实际运行中的NPE

@NonNull List newList;

List<@NonNull String> newList;

  • 抑或,类型转换

newStr = (@NonNull String) str;

  • 或者,继承或者实现接口语法中

class Warning extends @Localized Message

  • 抛出异常语句

public String readMethod() throws @Localized IOException

JDK8引入的数据类型提高了JAVA代码的可分析性,同时进一步增强了Java的类型校验功能特性

注解的分类

  • 预定义注解
  1. @Deprecated
  2. @Override
  3. @SuppressWarnings
  4. @SafeVarargs
  5. @FunctionalInterface
  • 元注解,即注解的注解
  1. @Retention
  2. @Documented
  3. @Target
  4. @Inherited
  5. @Repeatable

其中@Retention注解用以说明注解的生命周期,而@Target则用以说明注解的适用范围,即该注解可以用以修饰哪些元素

Target Constant Annotations Can be Applied To
ANNOTATION_TYPE Another annotation
CONSTRUCTOR Constructor
FIELD Field
LOCAL_VARIABLE Local variable
METHOD Method
PACKAGE Package
PARAMETER Parameter
TYPE Class, Interface, or enumeration
  • 自定义注解

注解的生命周期

  • SOURCE,源码阶段:比如常见的@Deprecated, @Override, @SuppressWarnings
  • CLASS,字节码阶段:注解在编译期保留,但会被JVM忽略
  • RUNTIME,运行期阶段:运行期间仍会保留

https://www.geeksforgeeks.org/annotations-in-java/

https://www.programiz.com/java-programming/annotations

你可能感兴趣的:(Spring,Java,中间件)