成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

進(jìn)擊的Android工程師之Java基礎(chǔ): 注解

muddyway / 2125人閱讀

摘要:基本語法我們通過注解的定義來切入注解的語法。跟定義接口差不多,就是用到的是,然后加上了元注解。那么元注解的作用是什么呢元注解元注解說明了注解所修飾對(duì)象的類型。也就是標(biāo)識(shí)該注解可以被繼承。的內(nèi)置注解重寫了父類的方法表示已過時(shí),不推薦使用。

在Android開發(fā)中我們經(jīng)常會(huì)用到注解,例如@Override Butterknife中的BindView等。這里主要記錄下注解怎么寫和簡單的使用。

基本語法

我們通過Override注解的定義來切入注解的語法。

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

在java源碼中,通過上面的幾行代碼就定義了一個(gè)Override的注解,定義注解的時(shí)候用到了兩個(gè)元注解Target,Retention。什么是元注解?注解注解的注解就是元注解。跟定義接口差不多,就是用到的是@interface,然后加上了元注解。那么元注解的作用是什么呢?

元注解

元注解:@Target,@Retention,@Documented,@Inherited

@Target

@Target說明了注解所修飾對(duì)象的類型。由EelmentType所描述

public enum ElementType {
    TYPE, //class interface enum
    FIELD, //域
    METHOD, //方法
    PARAMETER, //參數(shù)
    CONSTRUCTOR, //構(gòu)造
    LOCAL_VARIABLE, //局部變量
    ANNOTATION_TYPE, //注解
    PACKAGE, //包
}

實(shí)例:

/**
 * 這樣我們就定義了一個(gè)作用在類型和域上面的注解
 */
@Target({ElementType.TYPE, ElementType.FIELD})
public @interface Entity {
}
@Retention

@Retention 表明注解作用的時(shí)間。由RetentionPolicy所描述

public enum RetentionPolicy {
    /**
     * 只在源碼顯示,編譯時(shí)丟棄;
     */
    SOURCE,

    /**
     * 編譯時(shí)記錄到.class中,運(yùn)行時(shí)忽略;默認(rèn)值
     */
    CLASS,

    /**
     * 運(yùn)行時(shí)保留,運(yùn)行中可以處理。(我們用的較多的就是這個(gè))
     */
    RUNTIME
}
@Documented

含有該注解類型的元素(帶有注釋的)會(huì)通過javadoc或類似工具進(jìn)行文檔化。
我們來對(duì)比一下:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NoDocumented {
}

@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestDocumented {
}
    
    @TestDocumented
    public void funTestDocumented(){
        System.out.println("有@Documented");
    }

    @NoDocumented
    public void funNoDocucmented(){
        System.out.println("無@Documented");
    }

定義以上兩個(gè)注解并測試,利用javadoc生成文檔后顯示如下:

@Inherited

根據(jù)字面意思是繼承。也就是標(biāo)識(shí)該注解可以被繼承。只作用在類上面。

注解參數(shù)
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Entity {
    String value() default "";
    int name() default 0;
}

我們在定義注解的時(shí)候,可以添加相關(guān)的參數(shù)。定義了參數(shù)之后我們就可以通過反射的方式獲取到注解,然后獲取該參數(shù)了。如下所示:

        Class cClass = TestInheritedC.class;
        Entity annotation = cClass.getAnnotation(Entity.class);
        if (annotation != null) {
            String value = annotation.value();
            int name = annotation.name();
            System.out.println("value = " + value + "  name = " + name);
        }

注解參數(shù)的類型包括:基本數(shù)據(jù)類型String,Class,Enum,Annotation,及前邊這些類型的數(shù)組類型。

Java的內(nèi)置注解

@Override 重寫了父類的方法
@Deprecated 表示已過時(shí),不推薦使用。一般在使用被標(biāo)注的方法、類等時(shí)編輯器會(huì)出現(xiàn)刪除線。
@@SuppressWarnnings 用于通知Java編譯器關(guān)閉對(duì)特定類、方法、成員變量、變量初始化的警告

Android的相關(guān)注解
compile "com.android.support:support-annotations:24.2.0"

support-annotations包為我們提供了很多實(shí)用的注解,來方便代碼的檢查,例如 @Nullable ,@NonNull等,具體的使用參考Android官方文檔。

這里說一下類型的定義IntDefStringDef,在開發(fā)中經(jīng)常要使用Enum類型。不過Enum在開發(fā)中性能不如常量。我們可以使用注解的方式進(jìn)行替換。例如下面是View源碼中的一個(gè)栗子

    @IntDef({VISIBLE, INVISIBLE, GONE})
    @Retention(RetentionPolicy.SOURCE)
    public @interface Visibility {}

借用官方文檔上的栗子,是這么使用的:

    // Define the list of accepted constants and declare the NavigationMode annotation
    @Retention(RetentionPolicy.SOURCE)
    @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
    public @interface NavigationMode {}

    // Declare the constants
    public static final int NAVIGATION_MODE_STANDARD = 0;
    public static final int NAVIGATION_MODE_LIST = 1;
    public static final int NAVIGATION_MODE_TABS = 2;

    // Decorate the target methods with the annotation
    @NavigationMode
    public abstract int getNavigationMode();

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68797.html

相關(guān)文章

  • 進(jìn)擊Android程師Java基礎(chǔ): 反射

    摘要:不包含父類或父接口的方法返回,根據(jù)方法名和類型獲取。類或接口的及父類父接口公共成員方法。是的返回方法名,不包括修飾符,參數(shù)和返回值。打印打印拋出因?yàn)榈脑L問權(quán)限為拋出,因?yàn)槭歉割惖姆椒ā? 反射機(jī)制呢就是在程序運(yùn)行時(shí),動(dòng)態(tài)的獲取類(class),類的方法(method)屬性(field)等。主要的注意點(diǎn)就是程序運(yùn)行時(shí)動(dòng)態(tài)的獲取。這里主要是從代碼的角度來講解Java反射。在使用中我們用的較多...

    aaron 評(píng)論0 收藏0
  • Java 總結(jié)

    摘要:中的詳解必修個(gè)多線程問題總結(jié)個(gè)多線程問題總結(jié)有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升開源的運(yùn)行原理從虛擬機(jī)工作流程看運(yùn)行原理。 自己實(shí)現(xiàn)集合框架 (三): 單鏈表的實(shí)現(xiàn) 自己實(shí)現(xiàn)集合框架 (三): 單鏈表的實(shí)現(xiàn) 基于 POI 封裝 ExcelUtil 精簡的 Excel 導(dǎo)入導(dǎo)出 由于 poi 本身只是針對(duì)于 ...

    caspar 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.22 - 進(jìn)擊 Google I/O 2017

    摘要:谷歌表示,與搜索并列,是谷歌機(jī)器學(xué)習(xí)技術(shù)最重要的產(chǎn)品服務(wù)載體。谷歌宣布了基于機(jī)器學(xué)習(xí)技術(shù)的全面升級(jí),很可能是其誕生以來的最大升級(jí)。在去年的大會(huì)上,谷歌宣布了其第一代。 showImg(https://segmentfault.com/img/bVNTKT?w=900&h=385); Google I/O Google I/O 是由 Google 舉行的網(wǎng)絡(luò)開發(fā)者年會(huì),討論的焦點(diǎn)是用 G...

    darkbaby123 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<