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的类型校验功能特性
注解的分类
@Deprecated
@Override
@SuppressWarnings
@SafeVarargs
@FunctionalInterface
@Retention
@Documented
@Target
@Inherited
@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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)