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

你可能感兴趣的:(Java,学习记录,java)