小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

JAVA自定義注解、元注解介紹及自定義注解使用場景

 jackeyqing 2018-08-28

自定義注解會需要元注解,此處先介紹元注解。

元注解

java中有四種元注解:@Retention、@Inherited、@Documented、@Target

@Retention

注解的保留位置(枚舉RetentionPolicy),RetentionPolicy可選值:

  • SOURCE:注解僅存在于源碼中,在class字節(jié)碼文件中不包含
  • CLASS:默認(rèn)的保留策略,注解在class字節(jié)碼文件中存在,但運(yùn)行時無法獲得
  • RUNTIME:注解在class字節(jié)碼文件中存在,在運(yùn)行時可以通過反射獲取到

@Inherited

聲明子類可以繼承此注解,如果一個類A使用此注解,則類A的子類也繼承此注解

@Documented

聲明注解能夠被javadoc等識別(下面自定義注解處會有例子做介紹,點(diǎn)擊查看

@Target

用來聲明注解范圍(枚舉ElementType),ElementType可選值:

  • TYPE:接口、類、枚舉、注解
  • FIELD:字段、枚舉的常量
  • METHOD:方法
  • PARAMETER:方法參數(shù)
  • CONSTRUCTOR:構(gòu)造函數(shù)
  • LOCAL_VARIABLE:局部變量
  • ANNOTATION_TYPE:注解
  • PACKAGE:包

自定義注解介紹

自定義注解使用場景

  1. 類屬性自動賦值。
  2. 驗(yàn)證對象屬性完整性。
  3. 代替配置文件功能,像spring基于注解的配置。
  4. 可以生成文檔,像java代碼注釋中的@see,@param等

1和2這個沒有做過類似實(shí)例,應(yīng)該是像Hibernate中的使用注解映射Bean對象到數(shù)據(jù)庫一樣(此處為個人猜測,如有錯誤請留言指出),中間有檢測和自動賦值。

自定義注解定義

定義一個自定義注解(不使用元注解):

public @interface MyAnnotation{}
  • 1

定義一個自定義注解(使用元注解,每個元注解都是可選,非必選):

@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Target({ElementType.FIELD,ElementType.METHOD})
public @interface MyAnnotation1{
    public String name() default "hello";
}

注解中可以聲明成員方法,聲明的成員方法為最終的注解里面的參數(shù),成員方法可以使用default關(guān)鍵字設(shè)置默認(rèn)值。上面的注解使用如:@MyAnnotation1(name=”ddd”);

自定義注解演示

新建一個自定義注解:

@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Target({ElementType.FIELD,ElementType.METHOD})
@interface MyAnno{
    public String name() default "zhangsan";
    public String email() default "hello@example.com";
}

定義一個User類,來使用自定義注解:

class  User{

    @MyAnno(name = "zhang")
    private String name;

    @MyAnno(name = "zhang@example.com")
    private String email;


    @MyAnno(name = "sayHelloWorld")
    public String sayHello(){
        return "";
    }
}

  • @Documented注解的作用
    定義的MyAnno注解中使用了@Documented注解,現(xiàn)在來看下User類中sayHello方法的javadoc,截圖如下:
    這里寫圖片描述
    能看到@MyAnno注解出現(xiàn)在javadoc中。
    如果不使用@Documented注解,我們看下sayHello方法的javadoc,截圖如下:
    這里寫圖片描述
    發(fā)現(xiàn)@MyAnno的提示信息沒有了,也就是javadoc不能識別此注解信息了,@Documented注解的作用就很明顯能看出來了。

  • 通過反射獲取注解信息
    下面我們通過反射來演示下獲取屬性的注解信息和方法的注解信息:

Method[] methods = User.class.getMethods();
//Field[] fields = User.class.getFields();
Field[] fields = User.class.getDeclaredFields();
/*
    getFields:只能訪問public屬性及繼承到的public屬性
    getDeclaredFields:只能訪問到本類的屬性,不能訪問繼承到的屬性

    getMethods:只能訪問public方法及繼承到的public方法
    getDeclaredMethods:只能訪問到本類的方法,不能訪問繼承到的方法

    getConstructors:只能訪問public構(gòu)造函數(shù)及繼承到的public構(gòu)造函數(shù)
    getDeclaredConstructors:只能訪問到本類的構(gòu)造函數(shù),不能訪問繼承到的構(gòu)造函數(shù)
*/

for (Field field : fields) {
    MyAnno annotation = field.getAnnotation(MyAnno.class);
    if(annotation!=null){
        System.out.println("property="+annotation.name());
    }
}
for (Method method : methods) {
    MyAnno annotation = method.getAnnotation(MyAnno.class);
    if(annotation!=null){
        System.out.println("sayHello="+annotation.name());
    }
}

輸出如下:

property=zhang
property=zhang@example.com
sayHello=sayHelloWorld

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多