Java注解
目录
Java注解(Annotation)是Java语言中一种特殊的修饰符,它可以为Java代码提供元数据。以下是对Java注解的详细解释:
一、定义与基本概念
注解也叫元数据,是JDK 1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以用于类、方法、参数、变量、构造器以及包声明中,用于对这些元素进行说明和注释。相对于其他修饰符如public、final等,注解并不直接影响代码的语义,但能被某些工具软件(如编译器、框架)所读取和利用。
二、作用与分类
- 编写文档:通过代码里标识的注解,可以生成API文档,如Javadoc工具会根据源码中的注解来生成文档。
- 代码分析:通过代码里标识的注解,可以对代码进行分析。
- 编译检查:通过代码里标识的注解,编译器可以进行基本的编译检查。例如,@Override放在方法前,如果该方法不是重写父类的方法,则编译器会发出警告。
- 编译时动态处理:常见的Java框架(如Spring、Hibernate、JUnit等)会在编译时读取注解的信息,然后根据注解的信息进行一些处理。
- 生成额外的文件:如上文提到的生成API文档。
此外,Java注解还可以分为以下几类:
- 元注解:用于注解其他注解的注解,如@Retention、@Target、@Documented、@Inherited等。
- 编译时注解:在编译期间由编译器处理的注解,如@Override、@Deprecated、@SuppressWarnings等。
- 运行时注解:在程序运行时由虚拟机或者其他运行时环境处理的注解,这些注解可以在运行时通过反射机制获取到,并根据注解的信息进行相应的处理。常见的运行时注解包括@Autowired、@RequestMapping等。
- 标记注解:也称为空注解,它们本身没有任何成员,仅仅用于标记目标元素,表示一种特殊的状态或行为。常见的标记注解包括@Serializable、@Cloneable等。
- 单值注解:是只有一个成员的注解,可以通过简单的值赋给成员。常见的单值注解包括@SuppressWarnings、@Deprecated等。
- 重复注解:是Java 8中引入的特性,允许将同一个注解多次应用于同一个目标元素上。
三、内置注解
Java提供了一些预定义的注解,如:
-
@Override:限定重写父类方法。如果子类的方法与父类方法签名不匹配,编译器会报错。
-
@Deprecated:表示某个程序元素(如方法、类等)已经过时,提醒开发者不建议使用该程序元素。使用被此注解标记的元素时,编译器会给出警告。
-
@SuppressWarnings:告诉编译器忽略指定的警告。其参数包括:
- deprecation:使用了过时的类或方法时的警告。
- unchecked:执行了未检查的转换时的警告。
- fallthrough:当switch程序块直接通往下一种情况而没有break时的警告。
- path:在类路径、源文件路径等中有不存在的路径时的警告。
- serial:当在可序列化的类上缺少serialVersionUID定义时的警告。
- finally:任何finally子句不能正常完成时的警告。
- all:关于以上所有情况的警告。
四、元注解
元注解是注解的注解,用于定义注解的属性和行为。Java提供了以下一系列的元注解:
-
@Retention:确定注解的生命周期,即何时可用。它有一个枚举类型的值RetentionPolicy,包括:
- SOURCE:注解只在源码中保留,在编译成.class文件时不包含。
- CLASS:注解在.class文件中可用,但不会被JVM加载。
- RUNTIME:注解在运行时通过反射也可见。
-
@Target:指定注解可以应用的源码元素。它有一个枚举类型的值ElementType,包括:
- TYPE:类、接口(包括注解类型)或枚举声明。
- FIELD:字段声明(包括枚举常量)。
- METHOD:方法声明。
- PARAMETER:方法或构造器参数。
- CONSTRUCTOR:构造器声明。
- LOCAL_VARIABLE:局部变量声明。
- ANNOTATION_TYPE:注解类型声明。
- PACKAGE:包声明。
- TYPE_PARAMETER:类型参数声明(1.8新增)。
- TYPE_USE:任何使用类型的声明(1.8新增)。
-
@Documented:表示使用该注解的元素应被Javadoc或其他工具文档化。
-
@Inherited:表示该注解可以被子类继承。
-
@Repeatable:允许同一个注解在同一声明上使用多次(Java 8引入)。
五、自定义注解
除了Java内置的注解,用户还可以自定义注解,以满足特定的开发需求。自定义注解的语法如下:
public @interface MyAnnotation {
// 注解元素声明,相当于注解的属性
String value() default ""; // 可以有默认值
int count() default 0;
}
使用自定义注解时,可以在目标程序元素上加上注解,并为注解元素提供具体的值:
@MyAnnotation(value="Hello", count=5)
public class MyClass {
// 类定义
}
六、注解与反射
Java的反射机制允许在运行时获取类的信息,包括类的注解。通过反射,可以动态地读取和处理注解,从而实现一些灵活的功能。例如:
public class MyAnnotationTest {
public static void main(String[] args) throws Exception {
MyClass myClass = new MyClass();
Class<MyClass> myClassClass = MyClass.class;
// 获取类上的注解
if (myClassClass.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation annotation = myClassClass.getAnnotation(MyAnnotation.class);
System.out.println("value: " + annotation.value());
System.out.println("count: " + annotation.count());
}
}
}
上述代码通过反射机制获取了MyClass类上的MyAnnotation注解,并输出了注解的值。
综上所述,Java注解是一种强大的工具,它允许开发者在不修改代码逻辑的前提下,向源码中添加一些额外的信息。这些信息可以被编译器、框架或其他工具读取和利用,从而实现各种灵活的功能。
原文地址:https://blog.csdn.net/cuishujian_2003/article/details/143754054
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!