一篇文章通俗易懂的让你彻底理解 Java 注解

待兔 等级 1129 0 0

很多Java程序员,对Java的注解一知半解,更有甚者,有的人可能连注解是什么都不知道

本文我们用最简单的 demo , 最通俗最短的语言,带你了解注解到底是什么?

先来简单回顾一下基础,我们知道,Java 的源文件编辑后,生成 .class 文件,

  1. .Java源文件,这个是源文件时期
  2. 源文件经过编译生成 .class 字节码文件,这个也是编译时期
  3. .class 加载到内存中,就可以用了,这个是运行期间

如下图 一篇文章通俗易懂的让你彻底理解 Java 注解

记住以上知识点,下面和注解有关,我们正式来讲注解 本文将从以下 2 个方面来讲解注解

  • 1 注解是什么
  • 2 如何定义一个注解
  • 3 如何使用注解

尤其是第3条,很多人不理解注解,就是因为不知道如何使用注解 第3条本文会用最简单的语言来揭示如何使用

一 注解是什么?

一句话,注解就和生活中的标签一样,比如一个人,这个人可能有 学生标签,月光族标签,爱抬杠标签

二 如何定义一个注解

语法: public @interface 注解名 { } 对的, @interface 是个关键字,记住就行了,没有为什么 定义注解就是用@interface ,后面跟上注解名

比如定义一个名字叫 info 的注解,如下 新建一个文件 info.java,代码如下:

package com.demo;

//定义了一个叫做 info 的注解
public @interface info {

}

很简单吧,上面就定义了一个叫做 info 的注解,下面有2个问题来了

  • 第一个: info 注解用在什么地方? 是用到类名上? 还是用在 类的字段上 ? 还是用在类的方法上 ?

  • 第二个:info 注解生命周期(或叫保留策略,我更喜欢叫生命周期) 注解还有生命周期吗?答案是当然有了

    前面说过,注解类似标签,一个人可能刚毕业,有月光族标签,刚毕业赚的少嘛 但是有可能过了 3,4 年,技术好了,工资涨上去了,可能就没有月光族标签了

    那么标签有几个生命周期呢?就是本文开头讲的,参考上面的图 答案是:3 个 ,分别是 源文件期编译期运行期

就是说:有的注解存在于源文件期,有的标签存在于编译期,有的标签存在于运行期

::: tip 运行期的注解用的最多,本文着重讲运行期间,源文件期,编译期比较简单 看懂运行期后,可自行学习另外2个

运行期,也就是注解在运行期还存在 :::

我们接下来给 info 注解定义用在类的字段上,并且是存在于运行期间

先上代码,再解释,代码如下:

@Target(ElementType.FIELD)          //注解作用在类的字段上
@Retention(RetentionPolicy.RUNTIME) //注解存在于运行期
public @interface info {

}

由上面代码可以看到,出现了 @Target , @Retention 注解,那么 @Target , @Retention又是什么? 答:@Target, @Retention 是元注解,咋又出来一个元注解,可以望文生义:元就是元始的意思,最开始的意思 举个很简单的例子来帮助了解元注解是什么

比如开发一款 IOS APP 软件,用 xcode 这个软件开发,那么 xcode软件又是用什么开发的? 定义一个注解,用元注解 是不是很类似,如下图 一篇文章通俗易懂的让你彻底理解 Java 注解

看过上面的图应该能理解了,什么是元注解了吧,就是为了定义注解用的,知道怎么用就行了 就比如我们开发软件,要用到各种各样的开发软件的IDE,我们不用管这些IDE软件是哪个软件开发的 我们只需要知道,元注解就相当于IDE,注解就相当于我们开发的软件,就OK了

回到上面的info的定义,我们来解释一下 Target,Retention 这 2 个注解的用处以及能取哪些值

Target 元注解

用处:用来定义注解的用在的地方,比如是用在类上啊,还是用在字段上啊,还是用在方法上啊等 取值:我们列出几个常用的就行,其它的自行下去查义即可,如下 |取值|用在哪| |-|-|-| |ElementType.TYPE|类或者接口上| |ElementType.FIELD|类的字段上| |ElementType.METHOD|类的方法上| |ElementType.PARAMETER|方法的参数上|

Retention 元注解

用处:用来定义注解的生命周期(或叫保留策略,我更喜欢叫生命周期) 取值:就只有3个,如下 |取值|存在于哪个时期| |-|-|-| |RetentionPolicy.SOURCE|源文件期| |RetentionPolicy.CLASS|编译期| |RetentionPolicy.RUNTIME|源运行时期|

::: tip 元注解都是已经定义好的,我们只管用,只管知道怎么用就行 就是我们自定义一个注解时才用到元注解,取几个值,定义一下我们的注解用在哪些地方 存在的时期等,仅此而已 :::


通过上面的叙述,我们小小总结一下

  • 注解就是类似标签一样的东西
  • 注解定义是用 public @interface 注解名 { }
  • 注解是有使用的地方和生命周期的
  • 注解能用在类上,字段上,方法上,参数上等
  • 元注解就是用来定义注解的,就像 xcode 软件是用来开发IOS 软件一样的逻辑

下面我们来讲第三点,也是最重要的一点,我们学会了自定义注解,怎么使用呢?

三 如何使用注解

注解一般是和反射一块用的,不懂反射的,不懂Java的大Class的,一定要看看下面的2篇文章 一篇文章彻底搞懂Java的大Class到底是什么 一篇文章弄懂 Java 反射的使用

我们来扩展一下上面的 info注解,代码如下:

@Target(ElementType.FIELD)          //注解作用在类的字段上
@Retention(RetentionPolicy.RUNTIME) //注解存在于运行期
public @interface info {
    String job();       //job属性
    String comment();   //comment属性
}

对的,你又看到了注解还能定义属性,记住,就按照上面的定义就行了。 主要看怎么用

我们定义一个工人类Worker,如下:

//工人类
public class Worker {
    //工人的名字
    public String name;

    //工人简介方法,打印工作的基本信息
    public void show(){

    }
}

很简单的一个类,我们在 name 字段上添加我们定义的info注解,如下

public class Worker {

    //注解是能给属性传值的,job和comment和info定义中的相呼应,对,属性就是这样用的
    @info(job = "工程师",comment = "工作很努力") 
    public String name;

    public void show(){

    }
}

上面我们给 name 字段添加了我们自己定义的注解,并且给注解中传了工作的职位是:工程师 ,评价是:工作很努力 我们想在show()方法中,打印出工作的名字,职位,和评价

获取注解中的 job和 comment可以通过反射获取 ,注意看注释,如下

public class Worker {

    //注解是能给属性传的,job和comment和定义中的相呼应
    @info(job = "工程师",comment = "工作很努力")
    public String name;

    public void show(){
        //1 获取本类的字节码
        Class clz = this.getClass();

        //2 获取类中定义的字段
        Field[] fields = clz.getDeclaredFields();

        //3 遍历字段,看看哪个字段有info注解
        for (Field field : fields){
            //4 判断此字段上是否有 info 注解
            info annotation = field.getAnnotation(info.class);

            //5 如果不为 null ,说明 field上有info注解
            if (annotation != null){
                //6 通过info注解,获取info注解中的 job和comment
                String job = annotation.job();
                String comment = annotation.comment();

                //7 打印出来
                System.out.println("我是:" + this.name + " 我的职位是:" + job + "  我的评价是:" + comment);
            }
        }
    }
}

通过上面可以看出,使用注解步骤如下:

  1. 获取类的 Class ,也就是类的字节码
  2. 获取类的所有字段的字码码数组
  3. 遍历字段
  4. 通过 info annotation = field.getAnnotation(info.class)获取字段上对应的注解
  5. 通过注解,获取注解中传的值

我们再来写一个 main 函数,调用上面那段代码:如下

public class Demo1 {
    public static void main(String[] args){
        Worker worker = new Worker();
        worker.name = "待兔,www.helloworld.net 站长";
        worker.show();
    }
}

打印如下:

我是:待兔,www.helloworld.net 站长 我的职位是:工程师 我的评价是:工作很努力

本文到此,几乎讲完了,注解的很多其它的东西还没有讲,不过不重要,本文最重要的让你明白什么是注解,怎么定义注解,怎么使用注解 至于注解其它的知识,比如注解怎么用在方法上,用上类上,等等,都是类似,只需要查一下就行了。 网上很多文章 ,只要能通过本文把注解弄明白了,了解注解其它的就简单了。

收藏
评论区

相关推荐

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程
前言 阿里巴巴出了一本Java规范,在国内java开发眼里被赋予了神圣的殿堂,我不推荐你用阿里巴巴的开发手册。 目前Google Guava在实际应用中非常广泛,本篇博客将以博主对 Guava 使用的认识以及在项目中的经验来给大家分享!学习使用 Google Guava可以让你快乐编程,写出优雅的 Java 代码,在业务允许的条件下,我推荐使用 Guav
这些 JavaScript函数让你的工作更加 So Easy!
作者: YoussefZidan 译者:前端小智 来源:dev 点赞再看,养成习惯 本文 GitHub https://github.com/qq44924588...(https://github.com/qq449245884/xiaozhi) 上已经收录,更多往期高赞文章的分类,也整理了很多我的文档,和教程资料。欢迎Star和
java传值和传引用问题
这个问题还是很常见的,如果你平常敲代码比较多你可能经常会遇到这个问题。如果你知道java这个机制,你可能还会一直在找代码的问题。java中的值传递和引用传递。比如下面有这俩个方法java private void updataValue(String s){ s "123"; } private void upd
defer 让你的代码更清晰
日常开发中,我们经常会编写一些类似下面示例中的代码:gofunc writeToFile(fname string, data []byte, mu sync.Mutex) error mu.Lock() f, err : os.OpenFile(fname, os.ORDWR, 0666) if err ! nil mu.Unlock() retu
Fower: 一个可在 Vue 和 React 方便使用的 CSS in JS 库
一年多没写过文章了,今天给大家介绍一个我断断续续花了半年开发的 CSS 项目: . Fower 是什么?Fower 是一个让你高效开发 UI 的样式工具库,目标是让你写 CSS 不再痛苦。Fower 的核心特点是原子化(Atomic/utilityfirst)、类型安全(Type Safe)、CSS in JS,它非常注重开发体验,让你快速且开心的开发界面。
久等了,小傅哥的《重学Java设计模式》终于出版了,彩印&纸质!
作者:小傅哥博客:沉淀、分享、成长,让自己和他人都能有所收获!😄 一、前言来自延迟满足的幸福可能你的生活里很多时候很多人都在教你怎么快,“一年面上P6”、“一周学会Java”、“一文看懂C++”,似乎这些看上去的快,就是达到终点的最佳路径。而实际上快,却让你在本该沉淀的路上,漂浮了起来,一切感觉都美好,就是什么也搞不了。但如果你愿意慢下来,其实可以收获更多。
Java 实现聊天轰炸器,QQ,微信通用
Java 实现聊天轰炸器 我们需要用到一个类: Robot 类 原理就是,用 Robot 中的方法模拟按下 ctrl+v,然后按回车发送 注意:按下之后一定要松开 运行程序之前,先把要发送的内容剪切到粘贴板 大家重点在学习,不要有恶意行为 (要是你女朋友让你说一万遍“我爱你”,用它搞定( ̄ ̄))javaimport java.awt.;import jav
最方便的git教程使用大全,让你玩转git!!!
本篇是介绍廖雪峰老师官方网站中Git教程的学习笔记我感觉可以学到很多东西,可以使你简单上手,也可以供你复习时候使用。每个开发都可以从master上克隆一个本地版本库,就算没有网络,也可以提交代码到本地仓库、查看log、创建项目分支等等每个版本库都可以创建无限个分支,分支是个完整的目录,且这个目录拥有完整的实际文件 一、安装网上搜一下安装教程,这里就不介绍了安
学Python后到底能干什么?
Python是一种什么语言?Python是一种计算机程序设计语言。你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的Java语言等,Python是他们其中的一种。首先,我们普及一下编程语言的基础知识。用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个MP3,编写一个文档等,
如何让你的代码更优雅
前言你有没有骂过“前任”的代码?你的代码有没有被吐槽过?没有注释,命名随意,没有封装,结构混乱,一个页面几千行。。。。如何写出优雅的代码,让自己不被吐槽,让人羡慕,接下来咱就一起聊聊如何写出优雅的代码,如果大家有更好的写法和经验,欢迎在评论区留言,一起学习什么样的代码是优雅的代码咱先聊聊,什么样的代码是优雅的代码,在我看来,优雅的代码包括以下方面,首先就是代
一篇文章通俗易懂的让你彻底理解 Java 注解
很多Java程序员,对Java的注解一知半解,更有甚者,有的人可能连注解是什么都不知道本文我们用最简单的 demo , 最通俗最短的语言,带你了解注解到底是什么?先来简单回顾一下基础,我们知道,Java 的源文件编辑后,生成 .class 文件,1. .Java源文件,这个是源文件时期2. 源文件经过编译生成 .class 字节码文件,这个也是编译时期3
初级Java开发工程师!绝密文档,面试手册全面突击!!!秋招已经到来
这里我要明说一下,不是Java初级和学习Java的千万不要乱看,否则你会怀疑人生,因为会浪费你时间啊!!!本次考点是Java初级开发工程师面试必备的一些东西!!! 1、数据类型 基本类型cbyte/8、short/16、int/32、long/64、boolean/ 、char/16、float/32、double/64boolean只有两个值,true、f
【Java面试题】全网最全,近5年133个Java面试问题列表汇总,让你轻松拿大厂offer!!!!
133个Java面试问题列表汇总 前言Java 面试随着时间的改变而改变。在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进第二轮面试但是现在问题变得越来越高级,面试官问的问题也更深入。 在我初入职场的时候,类似于 Vector 与 Array 的区别、HashMap 与 Hashtable 的区别是最流行的问题。
JAVA回调机制(CallBack)之小红是怎样买到房子的??
JAVA回调机制CallBack 序言最近学习java,接触到了回调机制(CallBack)。初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义。当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题。但是,对于初学的我来说,缺了一个循序渐进的过程。此处,将我对回调机制的个人理解,按
【阅世界】如何让你的Terminal牛逼的更上一层楼
如果经常在Mac OS X的「终端(Terminal)」环境下工作的话,比如登陆远程服务器、执行一些特殊的命令等等。那么,设置一条欢迎语句会令你的终端表现的更Cool昨晚网上随便看看技术贴,偶然间看见别人的终端上的图案,经过早上的折腾,终于实现了想要的效果——自定义终端(Terminal)欢迎图案。来者先敬一拜下我的私人配置图案,后面您只需要复制粘贴就可以了