java注解(Annotation)

本文深入解析Java注解的使用与自定义,涵盖@Override、@Deprecated、@SuppressWarnings等系统内置注解,以及Retention、RetentionPolicy在自定义注解中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

系统内建的annotation

@Override

@Deprecated

@SuppressWarnings

自定义annotation

语法

Retention和RetentionPolicy


Annotation是在JDK1.5之后新增的特性,称为元数据特性。使用注释的方式加入一些程序的信息,Java.lang.annotation.Annotation接口是所有的Annotation都必须实现的接口。

系统内建的annotation

以下三个内建的Annotation类型用户可以直接使用:

  1. @Override:表示覆写的注解
  2. @Deprecated:表示废弃的注解
  3. @SuppressWarnings:表示压制安全警告的注解

以上3个注解的定义如下:

序号

Annotation

JAVA中的声明

1

@Override

@Target(value=METHOD)

@Retention(value=SOURCE)

public @interface Override

2

@Deprecated

@Documented

@Retention(value=RUNTIME)

@Target(value={CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE})

public @interface Deprecated

3

@SuppressWarnings

@Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})

@Retention(value=SOURCE)

public @interface SuppressWarnings

@Override

表示方法覆写的正确性,如果不使用此注解,那么当子类想覆写父类中的方法时不小心写错了就达不到最初的目的了。

代码示例:

class Person{
    public String getInfo(){return "这是一个Person类";}
}

class Student extends Person{
    @Override
    public String getInfo(){
        return "这是一个Student类";
    }
}

public class OverrideAnnotationDemo01 {
    public static void main(String [] args){
        Person per = new Student();
        System.out.println(per.getInfo());//输出信息
    }
}

 

如果将getInfo修改为其它名称,编辑器就会提示语法错误:

 

所以Override注解就是用来保证覆写的正确性。

@Deprecated

表示方法已经过时了,不推荐使用,本身不建议使用此操作。

代码示例:

class Person{
    @Deprecated
    public String getInfo(){return "这是一个Person类";}
}

public class DeprecatedAnnotationDemo01 {
    public static void main(String [] args){
        Person per = new Person();
        System.out.println(per.getInfo());//输出信息
    }
}

以上程序编译时会提示以下信息:

 

@SuppressWarnings

用来压制警告信息。在之前的泛型操作时,如果没有指定泛型的类型,那么使用时会出现安全警告。

代码示例:

class Demo<T>{
    private T var;
    public void setVar(T var){
        this.var=var;
    }
    public T getVar(){
        return this.var;
    }
}

public class SuppressWarningsAnnotationDemo01 {
    public static void main(String [] args){
        Demo d = new Demo();
        d.setVar("张三");
        System.out.println("内容:"+d.getVar());
    }
}

以上程序编译提示以下信息:

 

此时可以使用SupressWarnings压制此警告信息:

代码示例:压制unchecked警告信息

class Demo<T>{
    private T var;
    public void setVar(T var){
        this.var=var;
    }

    public T getVar(){
        return this.var;
    }
}

public class SuppressWarningsAnnotationDemo01 {
    @SuppressWarnings("unchecked")
    public static void main(String [] args){
        Demo d = new Demo();
        d.setVar("张三");
        System.out.println("内容:"+d.getVar());
    }
}

也可以同时压制多个警告信息,只需要以数组的形式出现即可。

代码示例:压制多个警告信息

class Demo<T>{
    private T var;
    public void setVar(T var){
        this.var=var;
    }
    public T getVar(){
        return this.var;
    }
}

public class SuppressWarningsAnnotationDemo01 {
    @SuppressWarnings({"unchecked","deprecation"})
    public static void main(String [] args){
        Demo d = new Demo();
        d.setVar("张三");
        System.out.println("内容:"+d.getVar());
    }
}

 

在设置注释信息的时候,以key->value的形式出现的,所以以上的@SuppressWarnings也可以直接使用”value={"unchecked","deprecation"}”的方式设置。

自定义annotation

语法

Annotation的定义格式为:

[public] @interface Annotation 名称{
    数据类型  变量名称();
}

​​​​​​​

代码示例2:定义无参数的注解

public @interface MyDefaultAnnotationNonePara {

}

之后就可以在程序中使用此注解了,代码如下:

@MyDefaultAnnotationNonePara
public class MyAnnotationDemo01 {

};

注意:要先编译注解文件,再编译使用注解的类

代码示例2:定义1个参数的注解

public @interface MyDefaultAnnotationSinglePara {
    public String value();//接收设置的内容

}

在程序中使用此注解,代码如下:

@MyDefaultAnnotationSinglePara( "笑笑")
@MyDefaultAnnotationNonePara
public class MyAnnotationDemo01 {

};

也可以使用变量接收参数,以上代码等价于

@MyDefaultAnnotationSinglePara(value = "笑笑")
@MyDefaultAnnotationNonePara
public class MyAnnotationDemo01 {

};

代码示例3:定义多个参数的注解

public @interface MyDefaultAnnotationMorePara {
    public String value();//接收设置的内容
    public String key();
}

在程序中使用此注解,代码如下:

@MyDefaultAnnotationMorePara(key="ksh",value="xiaoxiao")
@MyDefaultAnnotationSinglePara(value = "笑笑")
@MyDefaultAnnotationNonePara
public class MyAnnotationDemo01 {

};

代码示例4:注解接收一个数组

public @interface MyDefaultAnnotationArrayPara {
    public String [] value();//接收设置的内容

}

在程序中使用此注解,代码如下:

@MyDefaultAnnotationArrayPara({"xiaoxiao","lily","heby"})
@MyDefaultAnnotationMorePara(key="ksh",value="xiaoxiao")
@MyDefaultAnnotationSinglePara(value = "笑笑")
@MyDefaultAnnotationNonePara
public class MyAnnotationDemo01 {

};

也可以用value参数接收数组。以上所有的Annotation中,所有的参数内容需要在使用注解的时候设置上去,其实也可以像函数的默认参数一样,声明的时候使用default。

代码示例5:定义默认参数的注解

public @interface MyDefaultAnnotationDefaultPara {
    public String key() default "ksh";//指定好默认值
    public String value() default "xiaoxiao";//指定好默认值

}

在程序中使用此注解,代码如下:

@MyDefaultAnnotationDefaultPara()
@MyDefaultAnnotationArrayPara({"xiaoxiao","lily","heby"})
@MyDefaultAnnotationMorePara(key="ksh",value="xiaoxiao")
@MyDefaultAnnotationSinglePara(value = "笑笑")
@MyDefaultAnnotationNonePara
public class MyAnnotationDemo01 {

};

如果在操作中,注解在固定的范围内取几个值,这时就需要依靠枚举。

代码示例6:注解在枚举中取值

enum MyEnum{
    KSH,XIAOXIAO,KONGSH;
}

public @interface MyDefaultAnnotationEnum {
    public MyEnum name() default MyEnum.KONGSH;//指定好默认值
}

在程序中使用此注解,代码如下:

@MyDefaultAnnotationEnum(name=MyEnum.KSH)
@MyDefaultAnnotationDefaultPara()
@MyDefaultAnnotationArrayPara({"xiaoxiao","lily","heby"})
@MyDefaultAnnotationMorePara(key="ksh",value="xiaoxiao")
@MyDefaultAnnotationSinglePara(value = "笑笑")
@MyDefaultAnnotationNonePara
public class MyAnnotationDemo01 {

};

注意:

  1. 使用注解时也必须从枚举中取值;
  2. 当注解中的参数名称不是value时,使用注解必须指定参数名,如果为value的话可以直接传参。

Retention和RetentionPolicy

在注解中,可以使用Retention注解定义注解的保存范围,Retention注解的定义如下:

 

以上定义中存在了一个RetentionPolicy的变量,值为RUNTIME,此变量用于指定注解的保存范围。RetentionPolicy包含三种范围:

 

 

以上3个范围中,最需要关心的就是RUNTIME,因为在执行的时候才起作用。

代码示例:自定义注解,保存范围为RUNTIME

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

@Retention(value= RetentionPolicy.RUNTIME)//表示在运行时有效
public @interface MyDefaultRetentionAnnotation {
    public String name() default "ksh";//

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值