注解_自定义注解_格式、本质、属性,元注解

自定义注解格式

格式
元注解
public @interface 注解名称{
属性列表;
}

新建一个MyAnno类,将class替换为@interface

package annotation;

public @interface MyAnno {
    
    
}

该注解就可以进行使用

public class AnnoDemo2 {
    
    
    @Override
    public String toString() {
    
    
        return super.toString();
    }

    @Deprecated
    public void show1(){
    
    
        //有缺陷
    }


    @MyAnno
    public void show2(){
    
    
        //替代show1方法
    }

    public void demo(){
    
    

        Date date = new Date();
    }
}

新建一个文本文档,将MyAnno中的代码复制粘贴进去,将其后缀改为.java
进行javac编译,生成一个MyAnno.class文件,再进行反编译 javap编译
在这里插入图片描述

在这里插入图片描述

重新生成了一个MyAnno.java文件,即public interface MyAnno extends java.lang.annotation.Annotation {}

本质
注解本质上就是一个接口,该接口默认继承Annotation接口
public interface MyAnno extends java.lang.annotation.Annotation {}

属性:
接口中的抽象方法
* 要求:
1. 属性的返回值类型有下列取值
* 基本数据类型
* String
* 枚举
* 注解
* 以上类型的数组

示例:

public @interface MyAnno {
    
    


    int age();
    String name() default "张大帅";
    Person per();
    MyAnno2 anno2();

    String[] strs();
    /*String show2();

    Person per();
    MyAnno2 anno2();

    String[] strs();*/
   // Worker w();
}

package annotation;
@MyAnno(age = 12,per = Person.p1,anno2 = @MyAnno2(),strs = {
    
    "abc","vvv"} )
public class Worker {
    
    
}

定义了属性,在使用时需要给属性赋值

1. 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
2. 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
3. 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略

元注解:用于描述注解的注解

		* @Target:描述注解能够作用的位置
			* ElementType取值:
				* TYPE:可以作用于类上
				* METHOD:可以作用于方法上
				* FIELD:可以作用于成员变量上
		* @Retention:描述注解被保留的阶段
			* @Retention(RetentionPolicy.RUNTIME):当前被描述的注解,
			会保留到class字节码文件中,并被JVM读取到
		* @Documented:描述注解是否被抽取到api文档中
		* @Inherited:描述注解是否被子类继承	

示例:

@Target( {
    
    ElementType.TYPE,ElementType.METHOD,ElementType.FIELD}) //表示该MyAnno3注解只能作用于类上
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnno3 {
    
    

}
//@MyAnno(age = 12,per = Person.p1,anno2 = @MyAnno2(),strs = {"abc","vvv"} )
@MyAnno3
public class Worker {
    
    
   // @MyAnno3
    public String name = "bbb";
    @MyAnno3
    public void show(){
    
    

    }
}

例:使用javadoc对@Documented进行演示
同样,复制Worker类和MyAnno3注解到一个新的文件夹,cmd命令输入javadoc *.java -encoding UTF-8 -charset UTF-8
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到使用了Documented注解的方法被抽取到api文档中,否则没有抽取

猜你喜欢

转载自blog.csdn.net/weixin_44664432/article/details/109241165