Java注解,元注解,自定义注解的使用

简介: 本文讲解了Java中注解的概念和作用,包括基本注解的用法(@Override, @Deprecated, @SuppressWarnings, @SafeVarargs, @FunctionalInterface),Java提供的元注解(@Retention, @Target, @Documented, @Inherited),以及如何自定义注解并通过反射获取注解信息。

Java注解

从JDK5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息

注解(Annotation)可以看作是对 一个 类/方法 的一个扩展的模版,每个 类/方法 按照注解类中的规则,来为 类/方法 注解不同的参数,在用到的地方可以得到不同的 类/方法 中注解的各种参数与值

基本的注解

java提供了5个基本的注解,分别是@Override,@Deprecated,@SuppressWarnings,@SafeVarargs,@FunctionalInterface

1.@Override

限定父类重写方法: @Override,当子类重写父类方法时,子类可以加上这个注解,当子类重写父类方法时,子类可以加上这个注解。

2.@Deprecated

标示已过时:@Deprecated,这个注解用于表示某个程序元素类,方法等已过时,当其他程序使用已过时的类,方法时编译器会给出警告(xxx )

3.@SuppressWarnings

抑制编译器警告:@SuppressWarnings,被该注解修饰的元素以及该元素的所有子元素取消显示编译器警告

4.@SafeVarargs

“堆污染”警告与@SafeVarargs

5.@FunctionalInterface

函数式接口与@Functionallnterface,这个注解保证这个接口只有一个抽象方法,注意这个只能修饰接口。

函数式接口:如果接口中只有一个抽象方法(可以包含多个默认方法或多个static方法)
接口体内只能声明常量字段和抽象方法,并且被隐式声明为public,static,final。
接口里面不能有私有的方法或变量。

Java提供的元注解

元注解的作用就是负责注解其他的注解,用来提供对其他annotation类型作说明。

1.@Retention

@Retention用来修饰注解定义的,作用是被修饰的注解可以保存多久(即注解的生命周期)这个注解需要使用参数(参数可选 SOURCE,CLASS,RUNTIME)。

@Retention 源码:

package java.lang.annotation;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
   
    RetentionPolicy value();
}

@Retention注解参数是一个枚举类型,如下

package java.lang.annotation;

public enum RetentionPolicy {
   
    SOURCE,
    CLASS,
    RUNTIME
}

RetentionPolicy.CLASS(默认值) 编译器把该注解记录在class文件中。当运行java程序时,JVM不可获取注解信息。

RetentionPolicy.RUNTIME编译器把该注解记录在class文件中。当运行java程序时,JVM可获取注解信息,程序可通过反射获取该注解信息

RetentionPolicy.SOURCE 该注解只保存在源代码中,编译器直接丢弃该注解。

2.@Target

@Target注解,用于描述注解的使用范围,即注解可以用在哪些地方(TYPE 类|接口,FIELD 字段,METHOD 方法,PARAMETER 参数…),它的使用范围也是一个枚举数组 ElementType[] value();.

@Target注解定义源码:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
   
    ElementType[] value();
}

@Target注解的 ElementType[]参数数组源码:

package java.lang.annotation;

public enum ElementType {
   
    TYPE,
    FIELD,
    METHOD,
    PARAMETER,
    CONSTRUCTOR,
    LOCAL_VARIABLE,
    ANNOTATION_TYPE,
    PACKAGE,
    TYPE_PARAMETER,
    TYPE_USE
}
取值 注解使用范围
METHOD 可用于方法上
TYPE 可用于类或者接口上
ANNOTATION_TYPE 可用于注解类型上(被@interface修饰的类型)
CONSTRUCTOR 可用于构造方法上
FIELD 可用于字段上
LOCAL_VARIABLE 可用于局部变量上
PACKAGE 用于记录java文件的package信息
PARAMETER 可用于参数上

3.@Documented

@Documented注解用于指定被修饰的注解类将被javadoc工具提取成文档,如果定义注解类时使用了这个注解修饰,则所有使用该注解修饰的程序员苏API文档将会包含该注解说明。

package java.lang.annotation;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
   
}

4.@Inherited

@Inherited注解指定被它修饰的注解将具有继承性,即子类可以继承父类中的该注解

package java.lang.annotation;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
   
}

自定义注解

自定义注解,需要使用@interface来定义,使用@interface自定义注解时,自动继承java.lang.annotation.Annotation接口

自定义注解格式:

权限修饰符 @interface 注解名{
   
    // 定义内容
    String value() default "";
    // 参数类型 参数名 默认值 ;
    .....
}
  • @interface 用来声明一个注解
  • 其中上面的 String value();表示这个注解需要提供一个String类型的参数,且其默认值为空字符串default ""
  • value() 就是参数的名称
  • String 就是参数的要求类型,参数类型只能是基本类型(Class,String,enum)
  • 可以通过default 来声明参数的默认值
  • 如果只有一个参数成员,则一般参数名为value(当然可以自定义参数名,只是一种习惯)
  • 注解元素必须要求有值,定义注解元素时,经常使用空字符串,0作为默认值

自定义注解的使用

package com.robin.annotation;

import java.lang.annotation.*;
import java.lang.reflect.Method;

// 使用自定义的注解 传入参数 robin 和 23
@MyAnnotation(value = "robin", age = 23)
public class AnnoTest01 {
   


    // 使用自定义的注解 传入参数 知更鸟 和 18
    @MyAnnotation(value = "知更鸟",age = 18)
    public void test01() {
   

    }

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
   
        // 通过反射来获取当前Class类对象中的注解
        Class<?> cls = Class.forName("com.robin.annotation.AnnoTest01");// 获取AnnoTest01的Class类对象
        MyAnnotation annotation1 = cls.getAnnotation(MyAnnotation.class);// 获取当前Class类对象的注解信息
        System.out.println("作用在类上的注解:"+annotation1);// @com.robin.annotation.MyAnnotation(value=robin, age=23)
        // 通过Class类对象获取Method对象
        Method test01 = cls.getMethod("test01");
        MyAnnotation annotation2 = test01.getAnnotation(MyAnnotation.class);
        System.out.println("作用在method上的注解:"+annotation2);// @com.robin.annotation.MyAnnotation(value=知更鸟, age=18)

    }

}

// 自定义内部类注解
@Target({
   ElementType.TYPE, ElementType.METHOD})// 作用范围为类和方法上面
@Retention(RetentionPolicy.RUNTIME)// 此注解的生命周期为RUNTIME
@interface MyAnnotation {
   
    String value() default "";

    int age() default 0;
}

在这里插入图片描述


相关文章
|
10天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
6天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2506 14
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
6天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1519 14
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
8天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
530 13
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19282 30
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18836 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17524 13
Apache Paimon V0.9最新进展
|
8天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
457 48
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
|
1天前
|
云安全 存储 运维
叮咚!您有一份六大必做安全操作清单,请查收
云安全态势管理(CSPM)开启免费试用
353 4
叮咚!您有一份六大必做安全操作清单,请查收
|
2天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。