Java 使用Annotation功能


Annotation

Class Annotation

java.lang.Object
java.text.Annotation

java提供了Annotation功能,可称为自定义注解,用于对 类、构造方法、成员变量、方法、参数等声明,该功能不会影响程序的运行,会对编译器警告等辅助工具产生影响

定义 Annotation类型

定义用到 interface关键字 ,前面需加 @ ,定义Annotation类型关键字为: @interface

public @interface MyAnnotation{
    String value() default "ABC";
    Class type() default void.class;
}

MyAnnotation: 注解名称。调用时则为 @MyAnnotation
String、Class: 成员类型
value、type: 成员名称
default: 定义默认值(使用时无需声明)

使用种类锁定

@Target

定义Annotation类型时,可用@Target来设置Annotation类型适用的程序元素钟种类,未设置则为使用所有程序元素。@Target的设置有枚举类ElementType中的常量

ElementType枚举常量 说明
ANNOTATION_TYPE 用于Annotation类型
TYPE 用于类、接口、枚举、Annotation类型
CONSTRUCTOR 用于构造方法
FIELD 用于成员变量、枚举常量
METHOD 用于方法
PARAMETER 用于参数
LOCAL_VARIABLE 用于局部变量
PACKAGE 用于包

@Retention

定义Annotation类型时,@Retention用来设置Annotation的有效范围,未设置则为CLASS范围表示。@Retention的设置有枚举类RetentionPolicy中的常量

RetentionPolicy枚举常量 说明
SOURCE 表示不编译Annotation到类文件中,有效范围最小
CLASS 表示编译Annotation到类文件中,运行时不加载Annotation到JVM中
RUNTIME 表示在运行时加载Annotation到JVM中,有效范围最大

定义Annotation类型语法例子:

@Target(ElementType.CONSTRUCTOR,ElementType.METHOD)    //用于构造方法和方法
@Retention(RetentionPolicy.RUNTIME)                   //运行时加载Annotation到JVM
public @interface MyAnnotation{
    String value() default "ABC";
    Class type() default void.class;
}

例子:

@Constructor_Annotation 自定义注释

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.CONSTRUCTOR)//构造方法
@Retention(RetentionPolicy.RUNTIME)//运行时加载Annotation到JVM

public @interface Constructor_Annotation {
    String value() default "默认构造方法";
}

@MyAnnotation 自定义注释

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//用于构造方法和方法
@Target({ElementType.FIELD ,  ElementType.METHOD , ElementType.PARAMETER})
//运行时加载Annotation到JVM
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String describe();
    Class type() default void.class;
}

Record类 数据类

public class Record {
    //定义变量
    @MyAnnotation(describe = "编号" , type = int.class)
    int id ;
    @MyAnnotation(describe = "姓名" , type = String.class)
    String name;

    //空构造方法
    @Constructor_Annotation()
    public Record(){ }

    //构造方法 Record( int id , String name )
    @Constructor_Annotation("立即初始化构造方法")
    public Record(
            @MyAnnotation(describe = "编号" , type = int.class)
                    int id,
            @MyAnnotation(describe = "姓名" , type = String.class)
                    String name
    ){
        this.id = id ;
        this.name = name ;
    }

    //获取编号方法getid()
    @MyAnnotation(describe = "获取" , type = int.class)
    public int getid(){
        return id;
    }

    //更改编号方法 setid(int id)
    @MyAnnotation(describe = "设置编号")
    public void setid(
            @MyAnnotation(describe = "编号" , type = int.class)
                    int id
    ){
        this.id = id ;
    }

    //获取姓名方法getname()
    @MyAnnotation(describe = "获取姓名" , type = String.class)
    public String getname(){
        return name;
    }

    //更改姓名方法 setname(String name)
    @MyAnnotation(describe = "设置姓名")
    public void setname(
            @MyAnnotation(describe = "姓名" , type = String.class)
                    String name
    ){
        this.name = name ;
    }

}

Demo类 执行类

public class Demo {
    public static void main(String[] args) {
        Record r = new Record();
        Record r2 = new Record(2020003 , "Jak");

        System.out.println("==============输出对象r的成员变量");
        System.out.println("id(r):"+r.getid());
        System.out.println("name(r):"+r.getname());

        System.out.println("==============输出对象r2成员变量");
        System.out.println("id(r2):"+r2.getid());
        System.out.println("name(r2):"+r2.getname());


        //设置参数
        r.setid(22333);
        r.setname("Tom");
        System.out.println("==============输出对象r成员变量(以设置)");
        System.out.println("id(r):"+r.getid());
        System.out.println("name(r):"+r.getname());
    }
}

运行结果

==============输出对象r的成员变量
id(r):0
name(r):null
==============输出对象r2成员变量
id(r2):2020003
name(r2):Jak
==============输出对象r成员变量(以设置)
id(r):22333
name(r):Tom

文章作者: 柏竹
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 柏竹 !
评论
  目录