衡阳派盒市场营销有限公司

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次閱讀
    免费百家乐官网计划软件| 真人百家乐体验金| 网络百家乐官网的陷阱| sz全讯网新2xb112| 百家乐概率投注| 百家乐官网游戏真钱游戏| 大发888 澳门赌场| 百家乐网站程序| 皇冠网百家乐官网啊| 百家乐官网下注技术| 实战百家乐十大取胜原因百分百战胜百家乐不买币不吹牛只你能做到按我说的.百家乐基本规则 | 恒利百家乐的玩法技巧和规则| 百家乐官网那里可以玩| 百家乐官网赌博外挂| 网上真钱老虎机| 德州扑克怎么玩| 试玩百家乐帐| 百家乐分析仪有真的吗| 做生意房门挂啥招财| 百家乐官网押注最高是多少| 百家乐官网游戏分析| ewin娱乐城官方下载| 互联星空棋牌中心| 大发888线上娱乐百家乐| 威尼斯人娱乐场的微博 | 神人百家乐官网赌博| 新世纪百家乐官网现金网| 江华| 盛世娱乐| 新世纪| 澳门足球博彩| 娱乐城注册送| 大发888游戏平台dafa888gw| 微信百家乐群资源| 盈得利百家乐娱乐城| 威尼斯人娱乐789399| 威尼斯人娱乐场cqsscgw88| 广州百家乐娱乐场开户注册 | 电投百家乐官网网站| 百家乐官网五湖四海娱乐网| 现场百家乐官网牌路分析|