欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java中實(shí)現(xiàn)自定義注解方式

 更新時(shí)間:2024年11月04日 14:40:13   作者:YD_1989  
注解是Java中的一種元數(shù)據(jù),可以修飾方法、類、參數(shù)和包等,自定義注解需要public修飾符、@interface關(guān)鍵字,以及注解名稱和類型元素,元注解如@Target、@Retention等用于修飾注解,指定注解的適用范圍和生命周期,自定義注解的使用涉及到通過反射解析注解

一、什么是注解?

注解是一種能被添加到j(luò)ava源代碼中的元數(shù)據(jù),方法、類、參數(shù)和包都可以用注解來(lái)修飾。

注解可以看作是一種特殊的標(biāo)記,可以用在方法、類、參數(shù)和包上,程序在編譯或者運(yùn)行時(shí)可以檢測(cè)到這些標(biāo)記而進(jìn)行一些特殊的處理。

二、自定義注解需要的基本元素

自定義注解需要用到的東西:

  • 修飾符:訪問修飾符必須為public,不寫默認(rèn)為pubic;
  • 關(guān)鍵字:關(guān)鍵字為@interface;
  • 注解名稱: 注解名稱為自定義注解的名稱,使用時(shí)還會(huì)用到;
  • 注解類型元素: 注解類型元素是注解中內(nèi)容,可以理解成自定義接口的實(shí)現(xiàn)部分;
public @interface Info {
    String value() default "tracy";
    boolean isDelete();
}

三、自定義注解用到的元注解

JDK中有一些元注解,主要有@Target,@Retention,@Document,@Inherited用來(lái)修飾注解。

  • @Target:表明該注解可以應(yīng)用的java元素類型

  • @Retention:表明該注解的生命周期

  • @Document:表明該注解標(biāo)記的元素可以被Javadoc 或類似的工具文檔化
  • @Inherited:表明使用了@Inherited注解的注解,所標(biāo)記的類的子類也會(huì)擁有這個(gè)注解
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Info {
      String value() default "tracy";
      boolean isDelete();
}

四、自定義注解的使用

定義一個(gè)People類:

@Data
@Builder
@Define(isDelete = true)
public class People {

    /**
     * 姓名
     */
    private String name;

    /**
     * 年齡
     */
    private int age;

    /**
     * 是否有效
     */
    private boolean isDelete;

}

自定義注解:

import java.lang.annotation.*;

@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Define {

    String value() default "tracy";
    boolean isDelete();
}

利用反射解析注解

public static void main(String[] args) {

        try {
            //獲取Person的Class對(duì)象
            People person = People.builder().build();
            Class clazz = person.getClass();
            //判斷person對(duì)象上是否有Info注解
            if (clazz.isAnnotationPresent(Define.class)) {
                System.out.println("People類上配置了Define注解!");
                //獲取該對(duì)象上Info類型的注解
                Define infoAnno = (Define) clazz.getAnnotation(Define.class);
                System.out.println("person.name :" + infoAnno.value() + ",person.isDelete:" + infoAnno.isDelete());
            } else {
                System.out.println("People類上沒有配置Define注解!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

打印結(jié)果:

People類上配置了Define注解!

person.name :tracy,person.isDelete:true

對(duì)于一個(gè)類或者接口來(lái)說(shuō),Class類(java.lang包下)中提供了一些方法用于反射注解,當(dāng)然對(duì)于字段、方法來(lái)說(shuō)反射注解的方式很類似。

//返回指定的注解
getAnnotation
//判斷當(dāng)前元素是否被指定注解修飾
isAnnotationPresent
//返回所有的注解
getAnnotations

使用注解注意點(diǎn):

自定義注解中,設(shè)置了默認(rèn)值的屬性在使用時(shí)可以不用定義值,但是沒被設(shè)置默認(rèn)值的屬性使用時(shí)一定要定義屬性值。

示例:

如上圖,isTest注解沒有設(shè)置默認(rèn)值,使用Log注解沒定義isTest屬性值會(huì)報(bào)錯(cuò)。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot2.0 配置時(shí)間格式化不生效問題的解決

    springboot2.0 配置時(shí)間格式化不生效問題的解決

    這篇文章主要介紹了springboot2.0 配置時(shí)間格式化不生效問題的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 解決Netty解碼http請(qǐng)求獲取URL亂碼問題

    解決Netty解碼http請(qǐng)求獲取URL亂碼問題

    這篇文章主要介紹了解決Netty解碼http請(qǐng)求獲取URL亂碼問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Spring中七種事務(wù)傳播機(jī)制詳解

    Spring中七種事務(wù)傳播機(jī)制詳解

    這篇文章主要介紹了Spring中七種事務(wù)傳播機(jī)制詳解,Spring在TransactionDefinition接口中規(guī)定了7種類型的事務(wù)傳播行為,Propagation枚舉則引用了這些類型,開發(fā)過程中我們一般直接用Propagation枚舉,需要的朋友可以參考下
    2024-01-01
  • Java8的default方法詳細(xì)介紹

    Java8的default方法詳細(xì)介紹

    這篇文章主要介紹了Java8的default方法,詳細(xì)介紹了什么是default方法,在多繼承時(shí)的處理等,需要的朋友可以參考下
    2014-04-04
  • IDEA教程創(chuàng)建SpringBoot前后端分離項(xiàng)目示例圖解

    IDEA教程創(chuàng)建SpringBoot前后端分離項(xiàng)目示例圖解

    在使用spring、mybatis等框架時(shí),配置文件很復(fù)雜,有時(shí)復(fù)雜的讓人想放棄Java,使用C#。springboot出現(xiàn)這一切問題就都不是問題
    2021-10-10
  • RocketMQ線程池創(chuàng)建實(shí)現(xiàn)原理詳解

    RocketMQ線程池創(chuàng)建實(shí)現(xiàn)原理詳解

    這篇文章主要為大家介紹了RocketMQ線程池創(chuàng)建實(shí)現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • SpringBoot3整合mybatis-plus的實(shí)現(xiàn)

    SpringBoot3整合mybatis-plus的實(shí)現(xiàn)

    MyBatis-Plus是一個(gè)MyBatis的增強(qiáng)工具,在MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,本文主要介紹了Mybatis-Plus3.x的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • springboot整合 xxl-job及使用步驟

    springboot整合 xxl-job及使用步驟

    XXL-JOB是一個(gè)分布式任務(wù)調(diào)度平臺(tái),用于解決分布式系統(tǒng)中的任務(wù)調(diào)度和管理問題,文章詳細(xì)介紹了XXL-JOB的架構(gòu),包括調(diào)度中心、執(zhí)行器和Web管理控制臺(tái),并提供了使用步驟,包括下載、配置、啟動(dòng)和創(chuàng)建執(zhí)行器和任務(wù),感興趣的朋友一起看看吧
    2025-01-01
  • Java線程中的interrupt詳解

    Java線程中的interrupt詳解

    這篇文章主要介紹了Java線程中的interrupt詳解,interrupt翻譯成中文為“打斷”的意思,但實(shí)際上,interrupt()方法并非將一個(gè)線程打中斷的意思,本文提供了部分實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2023-09-09
  • Java幾個(gè)重要的關(guān)鍵字詳析

    Java幾個(gè)重要的關(guān)鍵字詳析

    這篇文章主要介紹了Java幾個(gè)重要的關(guān)鍵字詳析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考一下,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-07-07

最新評(píng)論