那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JAVA中注解是怎么做到的(上)

jf_78858299 ? 來源:JAVA旭陽 ? 作者:JAVA旭陽 ? 2023-05-11 10:57 ? 次閱讀

概述

注解想必大家在項(xiàng)目中經(jīng)常使用,比如Spring框架中常用的一些注解:@Controller@Service、@RequestMapping等等,它是JDK1.5及以后版本引入的一個(gè)特性。它可以聲明在包、類、字段、方法、局部變量、方法參數(shù)等的前面,用來對(duì)這些元素進(jìn)行說明,注釋。那么你知道JDK什么是元注解嗎?注解有哪些分類嗎?以及注解在Java中最本質(zhì)究竟是什么東西,是如何實(shí)現(xiàn)的呢?

注解的分類

根據(jù)注解的使用場景,主要分為三類,元注解、內(nèi)置注解和自定義注解。

元注解

用于定義注解的注解,通常用于注解的定義上,標(biāo)明該注解的使用范圍、生效范圍等。簡而言之,元注解是用來修飾注解的。

@Retention

指定注解信息保留到哪個(gè)階段,分別為源代碼階段、編譯Class階段、運(yùn)行階段。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    /**
     * Returns the retention policy.
     * @return the retention policy
     */
    RetentionPolicy value();
}
  • SOURCE: 保留在源代碼java中,被編譯器丟棄,也就是說在class文件中不包含注解信息,通常用來標(biāo)記源碼,引起大家的注意,比如自定義一個(gè)注解例如@ThreadSafe,用來標(biāo)識(shí)一個(gè)類時(shí)線程安全的。
  • CLASS: 編譯后的class文件中包含注解信息,但是會(huì)被jvm丟棄
  • RUNTIME: 注解信息在運(yùn)行期(JVM)保留(.class也有),可以通過反射機(jī)制讀取注解的信息

@Target

指定注解的使用范圍,如類、方法、屬性、局部屬性、參數(shù)等, 可以多選。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    /**
     * Returns an array of the kinds of elements an annotation type
     * can be applied to.
     * @return an array of the kinds of elements an annotation type
     * can be applied to
     */
    ElementType[] value();
}

具體可選的枚舉如下:

public enum ElementType {
    /** 適用范圍:類、接口、注解類型,枚舉類型enum */
    TYPE,
    /** 作用于類屬性 (includes enum constants) */
    FIELD,
    /** 作用于方法 */
    METHOD,
    /** 作用于參數(shù)聲明 */
    PARAMETER,
    /** 作用于構(gòu)造函數(shù)聲明 */
    CONSTRUCTOR,
    /** 作用于局部變量聲明 */
    LOCAL_VARIABLE,
    /** 作用于注解聲明 */
    ANNOTATION_TYPE,
    /** 作用于包聲明 */
    PACKAGE,
    /** 作用于類型參數(shù)(泛型參數(shù))聲明 */
    TYPE_PARAMETER,
    /** 作用于使用類型的任意語句(不包括class) */
    TYPE_USE
}

@Inherited

加上該注解的注解,表示可以被標(biāo)注的類子類繼承,比如A上標(biāo)記了帶有@Inherited的注解,那么類B繼承了A, 那么B也會(huì)有這個(gè)注解,默認(rèn)情況下注解是不支持繼承的。

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

@Document

將此注解包含在 javadoc 中 ,它代表著此注解會(huì)被javadoc工具提取成文檔。

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

@Repeatable

1.8中加入的元注解,用來標(biāo)記是否可以重復(fù)標(biāo)記。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Repeatable {
    /**
     * Indicates the containing annotation type for the
     * repeatable annotation type.
     * @return the containing annotation type
     */
    Class? extends Annotation value();
}

內(nèi)置注解

java提供了一些內(nèi)置注解,可以配合編譯器來檢查代碼的正確性, 我們可以關(guān)注他們的元注解。

@Override

標(biāo)記當(dāng)前方法是覆寫父類的方法。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

@Deprecated

標(biāo)記一個(gè)元素為已過期,不要在使用了

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

@SuppressWarnings

用來關(guān)閉編譯器輸出的警告信息

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

@FunctionalInterface

java8中引入,標(biāo)記是一個(gè)函數(shù)式接口,也就是說有且只有一個(gè)抽象方法的接口

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

自定義注解

注解遵循的格式一般如下:

//元注解部分 xxxx
@Retention(xxxx)
@Target(xxxx)
public @interface 注解名 {
  返回值 屬性名() 默認(rèn)值;
  返回值 屬性名() 默認(rèn)值;
}
  • 返回值支持的類型如下:java的8種基礎(chǔ)類型(不支持包裝類型)、String、Class、Enum、Annotation、以及上面類型的數(shù)組。
  • 默認(rèn)值可選,非必有。

舉個(gè)項(xiàng)目中自定義的栗子:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented  
@Inherited
public @interface DataAuthorize {
    /**
     * 資產(chǎn)ID
     * @return
     */
    String assetId();

    /**
     * 資產(chǎn)類型
     * @return
     */
    String assetType();

    /**
     * 權(quán)限代碼
     * @return
     */
    String authCode() default "";

    /**
     * 使用的類型
     * @return
     */
    Class[] useType();
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2975

    瀏覽量

    105147
  • JDK
    JDK
    +關(guān)注

    關(guān)注

    0

    文章

    82

    瀏覽量

    16637
  • spring框架
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    2055
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    示波器頻譜分析功能做到極致,怎么做到的?

    一、示波器的FFT 是什么? 二、示波器的FFT 能解決什么問題? 三、示波器的FFT 經(jīng)常變成用戶手里的雞肋,問題在哪? 四、我們把示波器的頻譜分析功能做到極致,怎么做到的? 五
    的頭像 發(fā)表于 06-12 09:19 ?1.2w次閱讀
    示波器<b class='flag-5'>上</b>頻譜分析功能<b class='flag-5'>做到</b>極致,<b class='flag-5'>怎么做到</b>的?

    Java中注解的作用

    Annotation 注解(Annotation),也叫元數(shù)據(jù)。一種代碼級(jí)別的說明。它是JDK1.5及以后版本引入的一個(gè)特性,與類、接口、枚舉是在同一個(gè)層次。它可以聲明在包、類、字段、方法、局部變量
    的頭像 發(fā)表于 09-30 10:12 ?1051次閱讀
    <b class='flag-5'>Java</b><b class='flag-5'>中注解</b>的作用

    如何通過注解來優(yōu)化我們的Java代碼

    注解Java注解是一種元數(shù)據(jù)形式,可以被添加到Java代碼中的各種元素(類、方法、字段等),以提供關(guān)于這些元素的額外信息。
    的頭像 發(fā)表于 09-30 11:39 ?694次閱讀

    PCB刻制線圈怎么做到

    `如附圖這種PCB刻制線圈是怎么做的,畫得這么圓是怎么做到的?`
    發(fā)表于 06-13 11:07

    詳細(xì)介紹了Java泛型、注解、并發(fā)編程

    介紹了Java泛型、注解、并發(fā)編程、數(shù)據(jù)傳輸與序列化、高效IO、容器集合、反射與類加載以及JVM重點(diǎn)知識(shí)線程、內(nèi)存模型、JVM運(yùn)行時(shí)內(nèi)存、垃圾回收與算法、Java中四種引用類型、GC 分代收集算法
    發(fā)表于 08-20 06:09

    HarmonyOS注解的使用方法分享

    定義我們的注解自定義注解1、聲明注解功能:檢測類中是否有規(guī)范的get方法新建java libray的module,命名為annotation,創(chuàng)建
    發(fā)表于 03-28 14:04

    分析java注解基本概念

    什么是注解(Annotation): Annotation(注解)就是Java提供了一種元程序中的元素關(guān)聯(lián)任何信息和著任何元數(shù)據(jù)(metadata)的途徑和方法。Annotion(注解
    發(fā)表于 09-27 14:53 ?0次下載

    怎么做到快速修補(bǔ)板式喂料機(jī)軸頭磨損

    怎么做到快速修補(bǔ)板式喂料機(jī)軸頭磨損
    發(fā)表于 01-23 11:10 ?2次下載

    Spring Boot常用注解與使用方式

    企業(yè)開發(fā)項(xiàng)目SpringBoot已經(jīng)是必備框架了,其中注解是開發(fā)中的小工具(誰處可見哦),用好了開發(fā)效率大大提升,當(dāng)然用錯(cuò)了也會(huì)引入缺陷。
    的頭像 發(fā)表于 07-08 10:57 ?1425次閱讀

    注解定義Bean及開發(fā)

    注解本質(zhì)是一個(gè)繼承了Annotation 的特殊接口,其具體實(shí)現(xiàn)類是Java 運(yùn)行時(shí)生成的動(dòng)態(tài)代理類。
    發(fā)表于 08-02 10:26 ?461次閱讀

    JAVA中注解怎么做到的(下)

    。它可以聲明在包、類、字段、方法、局部變量、方法參數(shù)等的前面,用來對(duì)這些元素進(jìn)行說明,注釋。那么你知道JDK什么是元注解嗎?注解有哪些分類嗎?以及注解Java中最本質(zhì)究竟是什么東西,
    的頭像 發(fā)表于 05-11 10:57 ?616次閱讀
    <b class='flag-5'>JAVA</b><b class='flag-5'>中注解</b>是<b class='flag-5'>怎么做到</b>的(下)

    怎么做到EMC設(shè)計(jì)與產(chǎn)品設(shè)計(jì)同步?(

    怎么做到EMC設(shè)計(jì)與產(chǎn)品設(shè)計(jì)同步?|深圳比創(chuàng)達(dá)EMC(
    的頭像 發(fā)表于 08-28 14:56 ?536次閱讀
    <b class='flag-5'>怎么做到</b>EMC設(shè)計(jì)與產(chǎn)品設(shè)計(jì)同步?(<b class='flag-5'>上</b>)

    怎么做到EMC設(shè)計(jì)與產(chǎn)品設(shè)計(jì)同步?(中)

    怎么做到EMC設(shè)計(jì)與產(chǎn)品設(shè)計(jì)同步?(中)相信不少人是有疑問的,今天深圳市比創(chuàng)達(dá)電子科技有限公司就跟大家解答一下!
    的頭像 發(fā)表于 08-29 10:34 ?491次閱讀

    怎么做到EMC設(shè)計(jì)與產(chǎn)品設(shè)計(jì)同步?(下)

    怎么做到EMC設(shè)計(jì)與產(chǎn)品設(shè)計(jì)同步?|深圳比創(chuàng)達(dá)EMC(下)
    的頭像 發(fā)表于 08-30 10:44 ?496次閱讀

    springmvc常用5種注解

    SpringMVC是一種基于Java的Web框架,使用注解可以更加方便靈活地開發(fā)和管理控制器,實(shí)現(xiàn)請(qǐng)求的映射和處理。在SpringMVC中,有許多常用的注解,本文將詳細(xì)介紹其中的五種注解
    的頭像 發(fā)表于 11-22 16:51 ?964次閱讀
    马德里百家乐官网的玩法技巧和规则 | 赌场百家乐的玩法技巧和规则| 百家乐官网德州扑克轮盘| 太阳城会员| 做生意家里摆什么招财| 仙游县| 百家乐平游戏| 24向山九宫格图| 百家乐官网稳定打法| 威尼斯人娱乐场是真的吗| 玄空飞星 24山 何??| 百家乐官网有看牌器吗| 大发888总结经验| 查看百家乐赌博| 蓝盾百家乐官网娱乐场开户注册| 集贤县| 大发888扑克| 百家乐号论坛博彩正网| 赌博中百家乐官网什么意思| 至棒娱乐备用| 姚记百家乐的玩法技巧和规则| 24山向中那个向最好| 百家乐官网电话投注多少| 红利来| 新澳门百家乐的玩法技巧和规则 | 优博娱乐场| 威尼斯人娱乐城地图| 太阳城百家乐如何看路| 百家乐官网澳门规矩| 百家乐官网好的平台| 大发888娱乐城备用网址| 网络百家乐程序| A8百家乐游戏| 大世界百家乐官网娱乐场| 百家乐官网庄闲点数| tt娱乐城怎么样| 百家乐论坛bocaila| 百家乐mediacorp| 反赌百家乐官网的玩法技巧和规则| 百家乐官网筹码多少钱| 屏东县|