多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > 注解基礎

注解基礎

來源:程序員人生   發布時間:2017-03-06 11:08:02 閱讀次數:3284次

注解系列

注解基礎

APT

JavaPoet

0x00 概述

本文主要是介紹注解的基礎知識,為后面的APT和JavaPoet打下基礎

0x01 甚么是注解

注解(Annotation)是Java5的1個新特性,是插入在代碼中的1種注釋或說是1種元數據(meta data),這些注釋信息可以在編譯期使用預編譯工具進行獲得處理,也能夠在運行期使用Java反射機制來獲得,這取決于你的注解類型。

0x02 注解的語法及其定義

在Android中注解常常存在我們代碼中:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);
        getIntentData();
    }

上面的@Override就是系統的注解,表明這是個重寫方法,點擊源碼可以看到長成下面的模樣

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

實際中會帶有1些參數

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface run_methodInfo {
        String name() default "long";
        String data();
        int id() default 365;
    }

@Retention @Target @Document @Inherited4種 是元注解即 “注解的注解”

@Target 表示該注解目標,可能的 ElemenetType 參數包括:

  • ElemenetType.CONSTRUCTOR 構造器聲明
  • ElemenetType.FIELD 域聲明(包括 enum 實例)
  • ElemenetType.LOCAL_VARIABLE 局部變量聲明
  • ElemenetType.METHOD 方法聲明
  • ElemenetType.PACKAGE 包聲明
  • ElemenetType.PARAMETER 參數聲明
  • ElemenetType.TYPE 類,接口(包括注解類型)或enum聲明

@Retention 表示該注解的生命周期,可選的 RetentionPolicy 參數包括

  • RetentionPolicy.SOURCE 注解只保存在源文件,當Java文件編譯成class文件的時候,注解被拋棄注解將被編譯器拋棄
  • RetentionPolicy.CLASS 注解被保存到class文件,但jvm加載class文件時候被拋棄
  • RetentionPolicy.RUNTIME 注解不但被保存到class文件中,jvm加載class文件以后,依然存在;,因此可以通過反射機制讀取注解的信息

@Documented 唆使將此注解包括在 javadoc 中
@Inherited 唆使允許子類繼承父類中的注解

使用注解需要遵照它的規則:

  • Annotation型定義為@interface, 所有的Annotation會自動繼承java.lang.Annotation這1接口,并且不能再去繼承別的類或是接口.
  • 參數成員只能用public或默許(default)這兩個訪問權修飾
  • 參數成員只能用基本類型byte,short,char,int,long,float,double,boolean8種基本數據類型和String、Enum、Class、annotations等數據類型,和這1些類型的數組.
  • 要獲得類方法和字段的注解信息,必須通過Java的反射技術來獲得 Annotation對象,由于你除此以外沒有別的獲得注解對象的方法(分為編譯期還是運行期)

0x03 使用

(這里僅介紹最多見的運行期的注解,編譯期注解觸及到apt、javapoet會單獨再開1篇介紹)

Step One 定義注解

先看3個Runtime注解,包括類、方法、字段,

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface run_classInfo {
    String value();
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface run_methodInfo {
    String name() default "long";
    String data();
    int id() default 365;
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface run_fieldInfo {
    int[] value();
}

Step two 使用這些注解,

@run_classInfo("類注解RunTime Class")
public class RunTimeTest {
    @run_fieldInfo(value = {77, 88})
    public String fieldInfo = "filedInfo";

    @run_fieldInfo(value = {163})
    public int id = 55;

    @run_methodInfo(name = "彩筆學長", data = "finance")
    public static String getMethod() {
        return RunTimeTest.class.getSimpleName();
    }
}

使用反射解析注解

    /**
     * 解析運行時注解
     */
    private void showRunTimeInfo() {
        StringBuffer sb = new StringBuffer();
        //獲得Class 注解
        Class<?> clazz = RunTimeTest.class;
        Constructor<?>[] constructors = clazz.getConstructors();
        //獲得包括的注解類信息
        run_classInfo runClassInfo = clazz.getAnnotation(run_classInfo.class);
        if (runClassInfo != null) {
            //獲得class注解
            sb.append("Class注解: ").append("\n");
            sb.append(Modifier.toString(clazz.getModifiers())).append(" ")
                    .append(clazz.getSimpleName()).append("\n");

            sb.append("注解值:").append("\n")
                    .append(runClassInfo.value()).append("\n\n");
        }

        //獲得Field注解
        sb.append("Field注解:").append("\n");
        Field[] fields = clazz.getDeclaredFields(); //獲得本身的不包括繼承類
        for (Field field : fields) {
            //獲得field注解類信息
            run_fieldInfo fieldInfo = field.getAnnotation(run_fieldInfo.class);
            if (fieldInfo != null) {
                sb.append(Modifier.toString(field.getModifiers())).append(" ")
                        .append(field.getType().getSimpleName()).append(" ")
                        .append(field.getName()).append("\n");
                sb.append("注解值: ").append("\n")
                        .append(Arrays.toString(fieldInfo.value())).append("\n\n");
            }
        }

        //獲得Method 注解
        sb.append("Method注解: ").append("\n");
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            run_methodInfo methodInfo = method.getAnnotation(run_methodInfo.class);
            if (methodInfo != null) {
                sb.append(Modifier.toString(method.getModifiers())).append(" ")
                        .append(method.getReturnType().getSimpleName()).append(" ")
                        .append(method.getName()).append("\n");
                sb.append("注解值:").append("\n");
                sb.append("name: ").append(methodInfo.name()).append("\n");
                sb.append("data: ").append(methodInfo.data()).append("\n");
                sb.append("id: ").append(methodInfo.id()).append("\n");
            }

        }
        tvDes.setText(sb.toString());
    }

0x04 參考文獻

  • http://www.cnblogs.com/lbangel/p/3523741.html
  • http://blog.csdn.net/github_35180164/article/details/52107204
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲综合影院 | 国产精品极品美女自在线看免费一区二区 | 国产视频日本 | 国产色综合久久无码有码 | 日韩欧美亚洲在线 | 日韩精品无码一区二区三区 | 欧美区亚洲区 | 亚洲欧洲在线观看 | 中文字幕一区二区三区在线观看 | 毛片aa| 国产成人高清亚洲一区久久 | 桃花福利视频在线观看 | 欧美成人做性视频在线播放 | 欧美精品国产一区二区三区 | 精品国产欧美一区二区最新 | 噜噜噜噜私人影院av线观看 | 欧美成人午夜视频 | 午夜一级精品免费毛片 | 91麻精品国产91久久久久 | 亚洲精品第一综合99久久 | 国产一级做a爱片久久片 | 性色生活免费看性大片 | 秋霞福利| 精品热线九九精品视频 | 欧美一区二区三区四区视频 | jizzjizz亚洲| 国产一级一片免费播放视频 | 精品无码久久久久久久动漫 | 一级做a爱片 | 欧美高清videos性极品 | 国产 福利 在线 | 亚洲欧美日韩中文字幕一区二区三区 | 日本亚洲一区二区 | 久一视频在线观看 | 福利片在线观看免费高清 | 国产精品区一区二区三 | 欧美日韩中文字幕一区二区高清 | 国产精品一区久久 | 国产一区二区三区四区五区六区 | 波多野结衣中文字幕一区二区三区 | 欧美伦乱 |