【Java】Java(四十九):注解及自定义注解

107 篇文章 20 订阅
订阅专栏




在这里插入图片描述

什么是注解?

  • 注解(Annotation)也称为元数据,是一种代码级别的说明
  • 注解是JDK1.5版本引入的一个特性,和类、接口是在同一个层次
  • 注解可以声明在包、类、构造器、字段、方法、成员变量、局部变量、方法参数等的前面,用来对这些元素进行说明

注解:就是具有特殊含义的标记(注解是给机器阅读的)

概述

作用:对Java中类、方法、成员变量做标记,然后进行特殊处理,至于到底做何种处理由业务需求来决定。
注解就是在代码里添加一些特殊标志,这些标志可以在编译,类加载,运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进行操作。

注解与注释不同,会影响程序的执行,而注释不会。

注解的作用

  1. 编译检查
  • @Override:用来修饰方法声明。
  • 用来告诉编译器该方法是重写父类中的方法,如果父类不存在该方法,则编译失败。

02_注解的作用-1599230063774-1603446034951.png

  1. 代码分析
  • 通过代码里标识的注解对代码进行分析
  • 框架的配置( 框架 = 代码 + 配置 )
    • 具体使用请关注框架课程的内容的学习(注解去配置数据)
  1. 生成帮助文档
  • @author:用来标识作者姓名
  • @version:用于标识对象的版本号,适用范围:文件、类、方法
    • 使用@author和@version注解就是告诉Javadoc工具在生成帮助文档时把作者姓名和版本号也标记在文档中

01_注解的作用-1599230063773-1603446034951.png

使用过的注解

  • @Override
    • 用来修饰方法声明,告诉编译器该方法是重写父类中的方法,如果父类不存在该方法,则编译失败
  • @Test
    • Junit测试注解
  • @FunctionalInterface //函数式接口

自定义注解

注解的定义格式

定义注解使用关键字:@interface

public @interface 注解名{
   //内容
}

注解本质上就是一个接口。所有注解都会继承一个接口:Annotation

public interface 自定义注解名 extends java.lang.annotation.Annotation {}

带有属性的注解

  1. 属性的格式
  • 格式1:数据类型 属性名(); //无默认值的属性
  • 格式2:数据类型 属性名() default 默认值; //有默认值的属性
  1. 属性定义示例
public @interface Student {
  String name();                // 姓名
  int age() default 18;         // 年龄
  String gender() default "男"; // 性别
} 
// 该注解就有了三个属性:name,age,gender
  1. 属性适用的数据类型【记住】
  • 八种基本数据类型(int,short,long,double,byte,char,boolean,float)
  • String,Class,注解类型,枚举类
  • 以上类型的一维数组形式

注解的使用

注解的使用格式

//无属性注解
@注解名   例:@Test

//有属性注解
@注解名(属性=,属性=)

注解可以在类上,成员变量上,构造方法上,方法上,参数上…
有默认值的属性,可以不用进行赋值。

案例:

public @interface Book {
    String name();

    double price() default 100.0;

    String[] author();
}

建立一个BookStore的类,在类中定义成员变量,构造方法,成员方法

@Book(name = "西游记", author = {"吴承恩", "张三"})
public class BookStore {
    @Book(name = "三国", price = 10, author = {"罗贯中"})
    private String book;

    @Book(name = "三国", price = 10, author = {"罗贯中"})
    public BookStore() {
    }

    @Book(name = "三国", price = 10, author = {"罗贯中"})
    public void test() {

    }
}

如果注解中只有一个属性要赋值,而且名字是value,可以将value给省略,可以直接给值。

元注解

元注解的作用:

默认情况下,注解可以用在任何地方,比如类,成员方法,构造方法,成员变量等地方
如果要限制自定义注解的使用位置怎么办?那就要学习一个新的知识点:元注解
结论:元注解是用来约束自定义注解的使用范围、生命周期。

常用元注解:

常用元注解:@Target、@Retention

@Target

  • 作用:指明此注解用在哪个位置,如果不写默认是任何地方都可以使用
  • @Target可选的参数值在枚举类ElemenetType中包括:
    • TYPE: 用在类,接口上
    • FIELD:用在成员变量上
    • METHOD: 用在方法上
    • PARAMETER:用在参数上
    • CONSTRUCTOR:用在构造方法上
    • LOCAL_VARIABLE:用在局部变量上
    • PACKAGE:包
    • ANNOTATION_TYPE:注解上

@Retention

  • 作用:定义该注解的生命周期(有效范围)。
  • @Retention可选的参数值在枚举类型RetentionPolicy中包括:
    • SOURCE:注解只存在于Java源代码中,编译生成的字节码文件中就不存在了
      • 使用场景:针对一些检查性的操作,比如:@Override ,就使用SOURCE注解
    • CLASS:注解存在于Java源代码、编译以后的字节码文件中,运行的时候内存中没有(默认值 )
      • 使用场景:在编译时进行一些预处理操作,比如:生成一些辅助代码,就用CLASS注解
    • RUNTIME:注解存在于Java源代码中、编译以后的字节码文件中、运行时内存中,程序可以通过反射获取该注解
      • 使用场景:要在运行时去动态获取注解信息,那只能用 RUNTIME 注解

图

元注解的使用:

@Target({ElementType.METHOD,ElementType.TYPE}) //元注解
@interface Stu{
    String name();
}

//类
@Stu(name="jack")  //成功
public class AnnotationDemo02 {
    // 成员变量
    @Stu(name = "lily")  // 编译失败
    private String gender;
    
    // 成员方法
    @Stu(name="rose")  //成功
    public void  test(){
    }
   
    // 构造方法
    @Stu(name="lucy") // 编译失败
    public AnnotationDemo02(){}
}

注解解析

获取注解数据的原理:
想要对注解中的数据进行解析,需要借助:AnnotatedElement 接口

  • Field,Method,Constructor,Class 等类都是实现了 AnnotatedElement 接口

AnnotatedElement 是一个接口,定义了解析注解的方法:

1. boolean isAnnotationPresent(Class<Annotation> annotationClass)   
   判断当前对象是否使用了指定的注解,如果使用了则返回true,否则false
   
   public class BookStore{
       
       @Book(name="书名")
       public void buy() // Method对象 判断该对象上是否使用了@Book注解
       {                 // boolean flag = Method对象.isAnnotationPresent(Book.class)
       }
   } 
    
  
2. T getAnnotation(Class<T> annotationClass) 
   根据注解类型获得对应注解对象
   //	获取注解的具体值见下面的综合案例
   // 获取对象上的自定义注解
   // Book bookAnno = Method对象.getAnnotation(Book.class); 
   //      bookAnno.属性   //获取注解中属性的值

Class,Constructor,Method,Field都会实现AnnotatedElement 接口

  • 解析类型上的注解:借助字节码对象(Class对象)
  • 解析构造方法上的注解:借助构造器对象(Constructor对象)
  • 解析方法上的注解:借助方法对象(Method对象)
  • 解析字段上的注解:借助字段对象(Field对象)

注解解析的步骤:(注解是书写在:类、方法、变量上)
1、利用反射技术获取注解作用的对象:类、方法、变量、构造方法
2、判断对象上是否有自定义注解存在
3、有:获取对象上的自定义注解
4、使用获取到的自定义注解对象,拿到注解中的属性值

注意:注解解析必须保证自定义注解生命周期在RUNTIME(程序运行中)

案例:

需求如下:

  1. 定义注解Book,要求如下:
    • 包含属性:String value() 书名
    • 包含属性:double price() 价格,默认值为 100
    • 包含属性:String[] authors() 多位作者
    • 限制注解使用的位置:类和成员方法上 【Target】
    • 指定注解的有效范围:RUNTIME 【Retention】
  2. 定义BookStore类,在类和成员方法上使用Book注解
  3. 定义TestAnnotation测试类获取Book注解上的数据
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD,ElementType.TYPE}) //使用范围:方法、类
@Retention(RetentionPolicy.RUNTIME) //保证注解在程序执行时有效(适用于注解解析)
public @interface Book {
    String value();
    double price() default 100;
    String[] authors();
}


//类
public class BookStore {
    @Book(value = "Java入门", authors = {"张老师", "毕老师"})
    public void buy() {
        System.out.println("购书.....");
    }
}

//对注解中的数据进行解析
public class TestBookStore {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //反射套路:1、Class  2、构造器   3、Method
        Class<BookStore> bookStoreClass = BookStore.class;

        //获取构造器
        Constructor<BookStore> con = bookStoreClass.getConstructor();
        BookStore bookStore = con.newInstance();//实例化对象

        //获取Method
        Method method = bookStoreClass.getMethod("buy");

        //解析注解的步骤
        if(method.isAnnotationPresent(Book.class)){
            //获取Method对象上的Book注解
            Book bookAnno = method.getAnnotation(Book.class);

            //获取注解上的数据
            String bookName = bookAnno.value();
            double bookPrice = bookAnno.price();
            String[] bookAuthors = bookAnno.authors();

            System.out.println("书名:"+bookName);
            System.out.println("价格:"+bookPrice);
            System.out.println("作者:"+ Arrays.toString(bookAuthors));
        }
    }
}

小结
注解解析的步骤:

  1. 利用反射技术获取相关的对象:类、构造器、方法、变量
  2. 使用方法getAnnotation,获取自定义注解对象
  3. 使用注解对象,分别获取注解中的属性值



在这里插入图片描述

java 自定义注解的实例详解
08-29
Java 自定义注解的实例详解 Java 自定义注解Java 语言中的一种重要特性,它可以用于创建文档,跟踪代码中的依赖性,并且可以执行编译时期检查。自定义注解可以让开发者根据需要创建自己的注解,以满足特定的需求...
Java 自定义注解
理想三旬
05-06 512
像平时用到的 springboot、mybatis 等框架提供了许多的注解,免去了许多配置文件的繁琐工作,大大简便了开发Java 提供了自定义注解的功能,这里就先展示简单的例子。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理,例如标注在方法上可以实现接口权限的校验。表明使用了@Inherited注解注解,所标记的类的子类也会拥有这个注解。表明该注解标记的元素可以被Javadoc 或类似的工具文档化。表明该注解的生命周期。
Java 工作实践: 自定义注解的使用
程序员小刘
03-20 1307
自定义注解的玩法有很多,最常见的莫过于声明注解通过反射读取但是上面这种一般现在在开发中不怎么常用,最常用的就是,我们通过 切面去在注解的前后进行加载创建注解@Target({/*** 功能/*** 是否保存请求的参数/*** 是否保存响应的参数设置枚举/*** 其它* 新增* 修改* 删除* 授权* 导出* 导入创建切面操作/*** 后置通过,⽬标⽅法正常执⾏完毕时执⾏} /*** 异常通知,⽬标⽅法发⽣异常的时候执⾏try {
使用Java实现自定义注解的方法与技巧
最新发布
技术研究中心
07-05 1300
自定义注解Java编程中强大的工具,可以用于代码的元数据描述、简化配置、实现AOP等。通过定义注解、使用注解和处理注解,我们可以实现许多有用的功能,提升代码的可读性和可维护性。在Java开发中,注解是一种强大的工具,广泛用于框架开发和代码的元数据描述。通过自定义注解,我们可以实现很多有用的功能,比如自动生成代码、简化配置、实现AOP等。注解(Annotation)是Java提供的一种元数据形式,可以在代码中添加额外的信息。关键字注解可以包含元素,就像接口中的方法一样。注解的方法,记录方法的执行时间。
Java 注解自定义注解(注解属性与使用)
m0_71621983的博客
07-19 5085
Java注解是一种元数据(metadata)机制,它提供了在Java代码中添加附加信息的方式。注解可以应用于类、方法、字段和其他程序元素,以提供关于这些元素的额外信息。注解以符号开头,后面跟着注解的名称。注解可以包含属性,属性可以带有默认值。使用注解时,可以为属性提供值,也可以使用默认值。提供编译时的静态检查和验证。在运行时通过反射获取元数据信息。自动生成代码或配置文件。在框架和库中进行配置和扩展。Java提供了一些内置的注解,如@Override和。
一文详解Java自定义注解及使用场景
攻城狮不是猫
02-28 2779
Java自定义注解是一种元数据,可以在Java程序中用来提供程序中的元数据信息。自定义注解允许开发人员在代码中嵌入元数据,这些元数据可以在编译时和运行时被读取和处理。Java注解是一种元数据,可以在代码中添加注释和标记,用于提供额外的信息和指示。它是Java开发中的一项重要技术,可以简化开发流程、提高代码的可读性和可维护性。本文将详细介绍Java注解的概念、使用方法以及如何自定义注解,以及注解在框架开发和代码分析中的应用。
Java 自定义注解及使用
西凉的悲伤博客
05-09 4460
我们定义一个类的时候是使用的 class 关键字定义的,现在我们想定义一个自己的注解 需要使用 @interface 关键字来定义。@Retention 用来指定注解的生命周期(源码、class文件、运行时),其可选值如下:● RetentionPolicy**.SOURCE** : 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解
谈谈Java自定义注解及使用场景
09-07
Java中的自定义注解是一种强大的工具,允许程序员在代码中添加元数据,这些元数据可以在编译时或运行时被解析和使用。自定义注解Java 5引入的新特性,它增强了代码的可读性和可维护性,同时也简化了框架和库的开发...
Java 自定义注解及利用反射读取注解的实例
08-29
Java 自定义注解及利用反射读取注解的实例 Java 中的注解(Annotation)是一种元数据,用于提供有关程序元素的信息,而不影响程序的执行。Java 中提供了多种元注解,包括 @Target、@Retention、@Documented、@...
详解Java注解教程及自定义注解
09-02
Java注解Java编程语言中的一个重要特性,它允许程序员在代码中嵌入元数据,即有关代码的信息,而不直接改变代码的行为。注解的引入是在Java 1.5版本中,自此以后,它们在各种Java框架和库中得到了广泛应用,例如...
java自定义注解接口限流demo
06-19
java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo...
Java注解自定义注解(Annotation)
Hicodden的博客
12-05 740
自定义注解(Annotation)都会了,进一步了解注解就更容易了
java 怎么自定义注解
servepeople的博客
08-17 363
总之,自定义注解Java语言的一个强大特性,允许你为代码添加元数据,从而实现更加灵活和可读的代码。然而,需要注意自定义注解的使用场景,确保它们在特定的上下文中得到正确的处理。在Java中,你可以通过定义自定义注解来为代码添加元数据,从而在编译时或运行时实现特定的行为。类通过反射来处理注解,并输出注解的成员值。关键字声明,类似于定义接口或类。是一个使用了这个注解的类。
Java 自定义注解, 以及@interface @Target @Retention @Around @Before @After ProceedingJoinPoint JoinPoint 等用法
预立数据科技
06-26 1103
Java 自定义注解, 以及@interface @Target @Retention @Around @Before @After ProceedingJoinPoint JoinPoint 等用法
java注解说明
12-14 155
*元注解@Target,@Retention,@Documented,@Inherited** @Target表示该注解用于什么地方,可能的ElemenetType参数包括:* ElemenetType.CONSTRUCTOR构造器声明* ElemenetType.FIELD域声明(包括enum实例)* ElemenetType.LOCAL_VARIABLE局...
Java实现自定义注解
热门推荐
全力奔跑,梦在彼岸
08-25 10万+
前言      上一篇文章介绍了注解的一些基本知识,这次来介绍下如何实现自定义注解注解如何使用。 正文      注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。...
Java注解自定义注解以及应用。
是江迪呀 的博客
08-22 699
Java自定义注解
Java自定义注解的使用
weixin_45565886的博客
10-01 3217
Java自定义注解的使用
java注解自定义注解
qq_54247497的博客
07-24 652
1、注解的作用 ①:注解一般用于对程序的说明,就像注释一样,但是区别是注释是给人看的,但是注解是给程序看的。 ②:让编译器进行编译检查的作用,比如下边这个@Override注解是重写的意思,子类重写了父类的方法,但是改动了方法名,所以报错。 2、注解的格式 注解是以“@注解名”在代码当中存在的,还可以添加一些参数值,例如 @SuppressWarnings(value = “unchecked”) 3、注解在哪里使用 可以附加在package、class、method、field等上面,相当于给他们添加
Java注解Annotation详解:自定义注解、元注解、应用场景
Java注解Annotation与自定义注解详解 Java注解Annotation是Java语言中的一种 metadata 机制,用于在源代码中添加信息,方便编译器、IDE、其他工具或者应用程序来了解代码的意图和结构。Java注解可以分为三类:标记...
写文章

热门文章

  • 信息科技如何做好风险管理 10537
  • SpringMVC - 详解RESTful 10237
  • SpringMVC 域对象共享数据 9397
  • 以企业架构为中心的SABOE数字化转型五环法 9292
  • 网络安全 人人有责 9115

分类专栏

  • JVM 付费 12篇
  • Spring 付费
  • Spring 家族 13篇
  • RabbitMQ 12篇
  • Kafka 1篇
  • RocketMQ
  • ElasticSearch
  • 送书活动 35篇
  • go 1篇
  • 微服务&分布式 2篇
  • MySQL 16篇
  • VUE 3篇
  • JavaWEB 13篇
  • MyBatis & MyBatis-Plus 3篇
  • 权限 2篇
  • Java 107篇
  • 运维 14篇
  • 云原生 14篇
  • Linux 1篇
  • 工作流
  • 官方活动 2篇

最新评论

  • 一文让你用上Xxl-Job 顺带了解cron表达式

    洞天福地种人生: 他不支持我在部署执行器的时候给一个cron定时然后注册到调度中心之后就直接启动了吗。不能做到首次部署的时候直接启动执行器直接自动开始执行定时任务,后续需要改配置的时候再上调度中心修改吗

  • 腾讯云AI代码助手-程序员的第三只手

    鸽芷咕: 大佬写的非常好,文笔清晰,内容优质,感谢大佬分享!期待博主更多优质好文

  • 腾讯云AI代码助手-程序员的第三只手

    程序边界: 你的博文让我不再感到茫然,提供了明晰的方向,每一次阅读都是一次心灵的提升,你的分享总是如此珍贵,真的非常感谢你一直以来的奉献。期待更多知识的分享。

  • 腾讯云AI代码助手-程序员的第三只手

    爱编程的喵喵: 优质好文,博主的文章细节很到位,兼顾实用性和可操作性,感谢博主的分享,期待博主持续带来更多好文

  • 腾讯云AI代码助手-程序员的第三只手

    Yawesh: 大佬的文章让我对这领域的技术问题有了更深入的了解,尤其是大佬提到的那些“坑点”,我相信能够在实际应用中避免或解决很多问题。谢谢大佬的分享,期待大佬的更多精彩文章,让我们共同学习、进步。非常不错的技术领域文章分享,解决了我在实践中的大问题!博主很有耐心,更有对知识的热忱和热爱,写了这么实用有效的分享,值得收藏点赞。

最新文章

  • 腾讯云AI代码助手-程序员的第三只手
  • AIGC时代程序员的跃迁——编程高手的密码武器
  • 为什么说掌握心理学知识成为产品经理一门必修课?
2024年23篇
2023年207篇
2022年4篇
2021年4篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我有一颗五叶草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

玻璃钢生产厂家国外万圣节商场美陈湖南户内玻璃钢雕塑订做价格江苏周年庆典商场美陈有哪些仿真玻璃钢雕塑工业生肖玻璃钢雕塑供应商新余多彩玻璃钢雕塑定做价格玻璃钢卡通雕塑规格常用指南安徽雕塑玻璃钢雕塑厂家吉林玻璃钢雕塑订做价格深圳室内商场美陈费用合肥玻璃钢动物雕塑浚县玻璃钢花盆花器弥勒市玻璃钢雕塑设计加工顺义玻璃钢花盆西藏公园玻璃钢雕塑价格南京玻璃钢雕塑工厂玻璃钢雕塑的功能详解儿童玻璃钢雕塑设计多少钱玻璃钢雕塑仿铜会掉色吗李大钊革命烈士玻璃钢群雕塑浙江周年庆典商场美陈厂家直销福州玻璃钢雕塑报价玻璃钢雕塑牛图片大全图片大型玻璃钢雕塑摆件重庆玻璃钢人物雕塑价格大型商场美陈研发公司中山大型玻璃钢雕塑厂家价格广东欧式玻璃钢雕塑优势余杭区玻璃钢金属雕塑柳州玻璃钢泡沫雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化