注解Annotation
注释(comment)!= 注解——>但是很多相似特征
历史:
Annotation是从JDK5.0开始引入的新技术
作用:
- 不是程序本身,但是对程序做出解释(这点倒是和注释相同)、
- 可以被其他程序(编译器等)读取
- 注解可以帮助查错,例如重写方法名不对之类的
格式:
注解:@注释名,最常用的@override,也可以添加一些参数值,如@SuppressWainings(value = "unchecked")
使用范围:
可以附加在package、class、method、field等上面,相当于给他们添加了额外的辅助信息,可以通过反射机制编程实现对这些元数据的访问
内置注解
- @Override:定义在java.lang.Override中,此注解只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明
- @Deprecated:定义在java.lang.Deprecated中,此注解可以用于修辞方法、属性、类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或者存在更好的选择
test()
- @SuppressWarinings:定义在java.lang.SuppressWarnings中,用来一致编译时的警告信息(镇压警告——>强迫症福音)
- 与前两个有所不同,此注解需要添加一个参数才能正确使用,这些参数都是已经定义好了
- @SuppressWarnings("all")
- @SuppressWarnings("unchecked")
- @SuppressWarnings(value = {"unchecked","deprecation"})
- 与前两个有所不同,此注解需要添加一个参数才能正确使用,这些参数都是已经定义好了
元注解
作用:负责注解其他注解,Java定义了4个标准的meta-annotation类型,它们被用来提供对其他annotation类型做说明
这些类型和他们所支持的类在java.lang.annotation包中可以找到
- @Target 注解使用范围
ElementType[] value();
- @Retention 需要在哪个级别保存该注解信息(描述注解的生命周期)
@Retention(value = RUNTIME
可选参数:
- SOURCE——>源码级别
- CLASS——>类级别
- RUNTIME——>运行时有效
runtime>class>source
我们的注解在哪个层次有效
- @Documented 说明该注解将被包含在javadoc中
- @Inherited 说明子类可以继承父类中的该注解
自定义注解
使用@interface自定义注解,自动挤成了java.lang.annotation.Annotation接口
分析:
- @interface用来声明一个注解,格式:@interface 注解名{定义内容}
- 其中的每一个方法实际上是声明了一个配置参数
- 方法的名称就是参数的名称
- 返回值类型就是参数的类型(返回值只能是基本类型,Class、String、enum)
- 可以通过default来声明参数的默认值
- 如果只有一个参数成员,一般参数名为value
- 注解元素必须要有值,定义注解元素时,经常使用空字符串,0作为默认值
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
public class Test {
//注解可以显式赋值,如果没有默认值就必须给注解赋值
@MyAnnotation(name = "介是一个test方法",id = 12)//没有顺序
public void test1(){
}
@MyAnnotation2("asd")
public void test2(){
}
}
//自定义一个注解
//Target表示我们的注解可以用在哪些地方
@Target(value = {ElementType.METHOD,ElementType.TYPE})//作用于类上和方法上
@Retention(value = RUNTIME)//运行时注解
@interface MyAnnotation{
//这是注解的参数:参数类型 + 参数名();
//可以赋值 String name() default "";
String name();
int age() default 0;
int id() default -1;//如果默认值为-1代表不存在,类似于indexof——>没有则返回-1
String[] scools() default{"xpu","xcc"};
}
@Target(value = {ElementType.METHOD,ElementType.TYPE})//作用于类上和方法上
@Retention(value = RUNTIME)//运行时注解
@interface MyAnnotation2{
String value();//只有一个值的时候,且名为value则可以省略
}
注意:
- 注解参数只有一个值的时候,且名为value则可以省略——>@MyAnnotation2("asd")
- 注解可以显式赋值,如果没有默认值就必须给注解赋值
- 注解的参数:参数类型 + 参数名();
- 设定默认值参数类型 + 参数名() default 该类型值;
文章内容教程来自:B站——>狂神说Java
https://www.bilibili.com/video/BV1p4411P7V3?p=4&share_source=copy_web