##注解
# jdk中预定的注解:
1.@Override
检测被注解标注的方法是否是继承自父类(接口)的
2.@Deprecated
该注解标注的内容,表示已经过时
3.@SuppressWarnings
压制警告,一般传递参数all, 比如@SuppressWarnings("all")
# 自定义注解:
1.格式:
元注解
public @interface 注解名称{}
2.本质:注解本质就是一个接口,该接口默认继承Annotation类
可以通过javap反编译看到它的本质
3.属性:接口中可以定义的成员方法
1.返回值类型:
* 基本数据类型
* String
* 枚举
* 注解
* 以上类型的数组
2.定义了属性,那么在使用该注解时需要给注解赋值
比如public @interface MyAnno{String show();}
使用时:@MyAnno(show="myanno")
public class Test{}
由给注解赋值的样式可以理解为注解里的方法为一个“属性”,所以在给注解添加属性的时候应该取一个属性的样式,而不是方法的名字,这样赋值的时候看起来更加直观
但是一个注解中可以有多个属性,但是并不想都给它赋值,那么可以给属性设置一个default,即设置了default的属性可以不进行赋值
比如public @interface MyAnno{String name() default "张三";int age();}
使用时:@MyAnno(age=18,name="李四") 或者: @MyAnno(age=18)
public class Test{} public class Test{}
注意:当属性只有一个的时候并且属性名为value的时候,给注解赋值的时候可以只写要赋的值
比如 public @interface MyAnno{String value();}
使用时@MyAnno("李四") 或 @MyAnno(value="李四")
public class Test{} public class Test{}
对数组类型的属性进行赋值的时候,使用{}包裹起来,但是如果只有一个值的时候,{}可以省略
3.元注解:用于描述注解的注解
* @Target 描述注解能够作用的位置 比如:@Target(value={ElementType.TYPE,ElementType.FIELD}) 或@Target(ElementType.TYPE)
ElementType.TYPE 可以作用在类上
ElementType.FIELD 可以作用在方法上
ElementType.METHOD 可以作用在成员变量上
* @Retention 描述注解被保留的阶段
RetentionPolicy.CLASS
RetentionPolicy.SOURCE
RetentionPolicy.RUNTIME
一般都写 RetentionPolicy.RUNTIME 当前被描述的注解被保留在字节码文件中,并可以被jvm读取
* @Documented 描述注解是否可以被抽到api文档中
加了该注解,那么被修饰的注解将可以被抽取到文档中
* @Inherited 描述注解是否可以被子类继承
加了该注解,那么那么被修饰的注解将可以被子类继承
#在程序中使用注解:获取注解中定义的属性
Class.getAnnotation(Class<A> annotationClass);//相当于在内存中生成一个该注解接口的子类实现对象
Annotation.方法名();//获取注解赋的值
简单的代码实现(https://blog.csdn.net/weixin_42265250/article/details/99838815)