注解
声明
这篇文章参考的是(210条消息) 十分钟深度学习Java注解_何学长在奔跑的博客-CSDN博客这位大佬的博客,写这篇文章呢就是记录下自己的学习记录,加入个人理解。
什么是注解?
注解,也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。这看不懂没关系,先别管吗,看了后面大概就知道它是干嘛用的。
注解有哪些类型?
按作用分类:(我直接照搬)
-
编写文档:通过代码里标识的元数据生成文档
-
代码分析:通过代码里标识的元数据对代码进行分析
-
编译检查:过代码里标识的元数据让编译器能够实现基本的编译检查
-
根据注解参数分类
1. 标记注解:没有参数的注解:,仅用自身的存在与否为程序提供信息,如@Override注解,该注解没有参数,用于表示当前方法为重写方法。
2. 单值注解: 只有一个参数的注解,如果该参数的名字为value,那么可以省略参数名
3. 完整注解: 有多个参数的注解。
内置注解
顾名思义就是jdk内置的注解。
-
@Override
标记在成员方法上,用于标识当前方法是重写父类(父接口)方法,编译器在对该方法进行编译时会检查是否符合重写规则,如果不符合,编译报错。
什么意思呢?就是你如果重写父类的方法,哪么如果在前面标记了@Override哪么你这个重写方法就要复合重写规则。举个列子:
@Verride //注解:说明接下来这个方法是重写父类的方法 public String ToString(){ return "dvhbd"; } //如果这样写 @Verride public String ToStrings(){//注意名字多了个s哪么它就不满足重写规则,编译时就要报错 return "dvhbd"; }
-
@Deprecated
用于标记当前类、成员变量、成员方法或者构造方法过时如果开发者调用了被标记为过时的方法,编译器在编译期进行警告。
我的理解就是每个语言都会跟新,所以以前的方法现在有了更高效方法,哪么这个方法就过时了,人们不用他了,但是我们使用过程又不知道这个方法过时没有,所以官方就会对过时的方法标记,当我们调用时就会提醒我们。当然过时方法依然可以用。举个列子:
看见没编译器就会自己提示这个函数已经过时,然后给它画上一杠,但是这个函数依旧额可以以用。
自己怎么用这个注解呢?
-
@SuppressWarnings
压制警告注解,可放置在类和方法上,该注解的作用是阻止编译器发出某些警告信息,该注解为单值注解。(就一个参数)
参数有:
- unchecked:未检查的转化,如集合没有指定类型还添加元素
- unused:未使用的变量
- resource:有泛型未指定类型
- path:在类路径,原文件路径中有不存在的路径
- deprecation:使用了某些不赞成使用的类和方法
- fallthrough:switch语句执行到底没有break关键字
- rawtypes:没有写泛型,比如: List list = new ArrayList();
- all:全部类型的警告
简单的说就是只要在警告前标记它并且加入警告的参数,编译器就不会警告这个错误了。
加入注解后
ok,就是这么用到。
自定义注解
格式: public @Interface 注解名 {属性列表/无属性}
注意: 如果注解体中无任何属性,其本质就是标记注解。但是与其标注注解还少了上边修饰的元注解。
我直接代码:
//定义注解
public @interface my{//表准自定义注解格式
/*属性的返回值类型必须是以下几种:
基本数据类型,String类型,枚举类型,注解,以上类型的数组
注意: 在这里不能有void的无返回值类型和以上类型以外的类型*/
int num() default 5; //默认值为5
String str();
}
//使用注解
@my(num=3,str="str")
//也可以为@my(str="str")
public class use{
void add(){
return 1;
}
}
/*在使用时需要给注解中的属性赋值
1. 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时可以不为属性赋值,它取的是默认值。如果为它再次传入值,那么就发生了对原值的覆盖。
2. 如果只有一个属性需要赋值,并且属性的名称为value,则赋值时value可以省略,可以直接定义值
数组赋值时,值使用{}存储值。如果数组中只有一个值,则可以省略{}
*/
元注解
元注解:元注解就是用来描述注解的注解。一般使用元注解来限制自定义注解的使用范围、生命周期等等。
我理解的是元注解可以修饰一般注解也可以修饰代码,一般注解修饰只能修饰代码,元注解可以修饰一般注解的使用范围,生命周期等。
元注解分类
- @Target 指定被修饰的注解的作用范围。其作用范围可以在源码中找到参数值。
举个例:
@Target(ElementType.TYPE)//TYPE参数就代表这个参数是用于描述类,接口,或enum
public @interface my{
//@Target(ElementType.TYPE)在这标记就会报错因为它是修饰类,接口,或enum的。
int num();
String str();
}
举例:
@Retention(RetentionPolicy..RUNTIME)
//参数RetentionPolicy..RUNTIME表示注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
public @interface my{
String str();
}
-
@Documented 指定了被修饰的注解是可以Javadoc等工具文档化
它是一个标记注解(标记注解没有参数)。被该标记注解标记的注解,生成doc文档时,注解是可以被加载到文档中显示的。
-
@Inherited 指定了被修饰的注解修饰程序元素的时候是可以被子类继承的
它是一个标记注解(标记注解没有参数)。
被修饰的注解是可以Javadoc等工具文档化
它是一个标记注解(标记注解没有参数)。被该标记注解标记的注解,生成doc文档时,注解是可以被加载到文档中显示的。
最后
以前很少写博客,这是第二次写,可能比较杂乱无章,错误比较多,个人理解也可能是错的。看不下去就不要看了吧,看我推荐大佬写的博客吧。