1. 程式人生 > >Java自定義Annotation,通過反射解析Annotation

Java自定義Annotation,通過反射解析Annotation

建立一個自定義的Annotation

import java.lang.annotation.*;
import java.lang.reflect.Method;


@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo {
    String author() default "hupeng";
    String version() default "1.0";
    String date();
    String comment();

}
  • Annotation methods can’t have parameters.
  • Annotation methods return types are limited to primitives, String, Enums, Annotation or array of these.
  • Annotation methods can have default values.

@Target:

   @Target說明了Annotation所修飾的物件範圍:Annotation可被用於 packages、types(類、介面、列舉、Annotation型別)、型別成員(方法、構造方法、成員變數、列舉值)、方法引數和本地變數(如迴圈變數、catch引數)。在Annotation型別的宣告中使用了target可更加明晰其修飾的目標。

  作用:用於描述註解的使用範圍(即:被描述的註解可以用在什麼地方)

  取值(ElementType)有:

    1.CONSTRUCTOR:用於描述構造器
    2.FIELD:用於描述域
    3.LOCAL_VARIABLE:用於描述區域性變數
    4.METHOD:用於描述方法
    5.PACKAGE:用於描述包
    6.PARAMETER:用於描述引數
    7.TYPE:用於描述類、介面(包括註解型別) 或enum宣告

@Retention:

  @Retention定義了該Annotation被保留的時間長短:某些Annotation僅出現在原始碼中,而被編譯器丟棄;而另一些卻被編譯在class檔案中;編譯在class檔案中的Annotation可能會被虛擬機器忽略,而另一些在class被裝載時將被讀取(請注意並不影響class的執行,因為Annotation與class在使用上是被分離的)。使用這個meta-Annotation可以對 Annotation的“生命週期”限制。

  作用:表示需要在什麼級別儲存該註釋資訊,用於描述註解的生命週期(即:被描述的註解在什麼範圍內有效)

  取值(RetentionPoicy)有:

    1.SOURCE:在原始檔中有效(即原始檔保留)
    2.CLASS:在class檔案中有效(即class保留)
    3.RUNTIME:在執行時有效(即執行時保留)

@Documented:

  @Documented用於描述其它型別的annotation應該被作為被標註的程式成員的公共API,因此可以被例如javadoc此類的工具文件化。Documented是一個標記註解,沒有成員。

@Inherited:

  @Inherited 元註解是一個標記註解,@Inherited闡述了某個被標註的型別是被繼承的。如果一個使用了@Inherited修飾的annotation型別被用於一個class,則這個annotation將被用於該class的子類。

  注意:@Inherited annotation型別是被標註過的class的子類所繼承。類並不從它所實現的介面繼承annotation,方法並不從它所過載的方法繼承annotation。

Java 內建的Annotation

從java5版本開始,自帶了三種標準annontation型別,

  • Override,java.lang.Override 是一個marker annotation型別,它被用作標註方法。它說明了被標註的方法過載了父類的方法,起到了斷言的作用。如果我們使用了這種annotation在一個沒有覆蓋父類方法的方法時,java編譯器將以一個編譯錯誤來警示。這個annotaton常常在我們試圖覆蓋父類方法而確又寫錯了方法名時加一個保障性的校驗過程。
  • Deprecated,Deprecated也是一種marker annotation。當一個型別或者型別成員使用@Deprecated修飾的話,編譯器將不鼓勵使用這個被標註的程式元素。所以使用這種修飾具有一定的 “延續性”:如果我們在程式碼中通過繼承或者覆蓋的方式使用了這個過時的型別或者成員,雖然繼承或者覆蓋後的型別或者成員並不是被宣告為 @Deprecated,但編譯器仍然要報警。注意:@Deprecated這個annotation型別和javadoc中的 @deprecated這個tag是有區別的:前者是java編譯器識別的,而後者是被javadoc工具所識別用來生成文件(包含程式成員為什麼已經過時、它應當如何被禁止或者替代的描述)。
  • SuppressWarnings,此註解能告訴Java編譯器關閉對類、方法及成員變數的警告。有時編譯時會提出一些警告,對於這些警告有的隱藏著Bug,有的是無法避免的,對於某些不想看到的警告資訊,可以通過這個註解來遮蔽。SuppressWarning不是一個marker annotation。它有一個型別為String[]的成員,這個成員的值為被禁止的警告名。對於javac編譯器來講,被-Xlint選項有效的警告名也同樣對@SuppressWarings有效,同時編譯器忽略掉無法識別的警告名。

下面我們來使用Java內建的Annotation 和 自定義的Annotation

public class AnnotationExample {
    @Override
    @MethodInfo(author = "xxx",version = "1.0",date = "2015/03/26",comment = "override toString()")
    public String toString() {
        return "AnnotationExample{}";
    }

    @Deprecated
    @MethodInfo(comment = "deprecated method", date = "2015/03/26")
    public static void oldMethod() {
        System.out.println("old method, don't use it.");
    }

    @SuppressWarnings({ "unchecked", "deprecation" })
    @MethodInfo(author = "Pankaj", comment = "Main method", date = "Nov 17 2012", version = "1.0")
    public static void genericsTest() {
        oldMethod();
    }
}

使用反射來解析Annotation

注意我們的Annotation的Retention Policy 必須是RUNTIME,否則我們無法在執行時從他裡面獲得任何資料。

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

/**
 * Created by Administrator on 2015/3/26.
 */
public class AnnotationParsing {

    public static void main(String[] args) {
        for (Method method: AnnotationExample.class.getMethods()) {
            if (method.isAnnotationPresent(MethodInfo.class)) {
                for (Annotation annotation:method.getAnnotations()) {
                    System.out.println(annotation + " in method:"+ method);
                }

                MethodInfo methodInfo = method.getAnnotation(MethodInfo.class);

                if ("1.0".equals(methodInfo.version())) {
                    System.out.println("Method with revision no 1.0 = "
                            + method);
                }
            }
        }
    }
}

相關推薦

Java定義Annotation,通過反射解析Annotation

建立一個自定義的Annotation import java.lang.annotation.*; import java.lang.reflect.Method; @Documented @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUN

android 定義註解 通過反射獲取註解屬性值

參考文章:http://xuwenjin666.iteye.com/blog/1637247 1.自定義註解 package cn.veji.hibernate.po; import java.lang.annotation.ElementType; import ja

android 定義註解 通過反射獲取註解屬性值

1.自定義註解 package cn.veji.hibernate.po; import java.lang.annotation.ElementType; import java.

android反射元件 (一)java 定義annotation基礎知識

自定義annotation包括三部分: 自定義annotation、使用annotation的類、annotation的處理方法。 一、自定義annotation        元註解包括以下:            1)@Target    描述註解使用的範圍  取值包括

Java註解(Annotation)基本概念、定義註解、註解解析

什麼是註解(Annotation):  Annotation(註解)就是Java提供了一種元程式中的元素關聯任何資訊和著任何元資料(metadata)的途徑和方法。Annotion(註解)是一個介面,程式可以通過反射來獲取指定程式元素的Annotion物件,然後通過Annotion物件來獲取註解裡面的元資料。

Java 定義註解&通過反射獲取類、方法、屬性上的註解

反射 JAVA中的反射是執行中的程式檢查自己和軟體執行環境的能力,它可以根據它發現的進行改變。通俗的講就是反射可以在執行時根據指定的類名獲得類的資訊。   註解的定義 註解通過 @interface 關鍵字進行定義。 /** * 自定義註解 *

Java定義註解之元註解(meta-annotation)Target、Retention、Documented、Inherited介紹

元註解:   元註解的作用就是負責註解其他(如:自定義)註解,用來對其它 annotation型別作說明。Java定義了4個標準的meta-annotation型別:    [email protected]    [email protected

Java定義註解Annotation詳解

一:簡介 開發中經常使用到註解,在專案中也偶爾會見到過自定義註解,今天就來探討一下這個註解是什麼鬼,以及註解的應用場景和如何自定義註解。 下面列舉開發中常見的註解 @Override:用於標識該方法繼承自超類, 當父類的方法被刪除或修改了,編譯器會提示錯

Java中實現定義的註解處理器(Annotation Processor)

在之前的《簡單實現ButterKnife的註解功能》中,使用了執行時的註解實現了通過編寫註解繫結View與xml。由於執行時註解需要在Activity初始化中進行繫結操作,呼叫了大量反射相關程式碼,在介面複雜的情況下,使用這種方法就會嚴重影響Activity初始

Java定義註解反射校驗數據

sda new out 格式 是否 本地 imp 使用範圍 數據類型 package com.annotations.ecargo; import java.lang.annotation.ElementType; import java.lang.annotati

java定義註解解析及相關場景實現

註解(Annotation)是java1.5之後提供的一種語法。其主要作用是編譯檢查(比如@override)和程式碼分析(通過程式碼中添加註解,利用註解解析器對添加了註解的程式碼進行分析,獲取想要的結果,一般自定義的註解都是這一種功能)。 1.1 JDK提供的註解 JDK提供的

java定義註解學習(三)_註解解析及應用

上篇文章已經介紹了註解的基本構成資訊。這篇文章,主要介紹註解的解析。畢竟你只聲明瞭註解,是沒有用的。需要進行解析。主要就是利用反射機制在執行時進行檢視和利用這些資訊 常用方法彙總 在Class、Field、Method、Constructor中都有如下方法: //獲取所有的註解 public Annota

Java定義註解和執行時靠反射獲取註解

<span style="font-family:SimHei;font-size:18px;color:#663300;"><strong><span class="bh_code_a_Java_keywords">public</span> <span

JAVA-註解(2)-定義註解及反射註解

自定義註解開發   1.開發一個註解類     開發一個註解類的過程,非常類似於開發一個介面,只不過需要通過@interface關鍵字來宣告   2.使用元註解修飾註解的宣告     所謂的原註解是用來修飾註解宣告的註釋,可以控制被修飾的註解的特性。     @Target       用來宣告被

jquery的定義事件通過on綁定trigger觸發

測試 觸發 調用示例 事件觸發 我們 trigge spa src margin jquery綁定自定義事件,可以實現預先綁定好一個處理方法,當需要使用的時候利用jquery trigger來觸發自定義事件,以達到方便快捷的目的。我們來假設一個這樣的場景,一個textare

Java定義異常

trace tex logs fin rate cat java自定義異常 leg pan package cn.Douzi.Lab7_4; public class Triangle { int a, b, c; publ

[轉][Java]定義標簽簡介

是否 沒有 override include file sch lang oca uri 作用:自定義標簽主要用於移除 jsp 頁面中的 java 代碼。 實現:需要完成以下兩個步驟: 編寫一個實現 Tag 接口的 Java 類,把頁面 java 代碼移到這個 java

java定義註解

不包含 doc 1.2 color 子類 局部變量 ati 包含 ant Java註解是附加在代碼中的一些元信息,用於一些工具在編譯、運行時進行解析和使用,起到說明、配置的功能。註解不會也不能影響代碼的實際邏輯,僅僅起到輔助性的作用。包含在 java.lang.annot

Java定義方法轉換前端提交的json字符串為JsonObject對象

eid test 提交 rac quest https std bject app 前端提交json字符串格式數據,Java後端通過自定義方法接收json字符串數據並轉換為JsonObject對象,代碼如下放到RequestData.Java類中: public stat

Java定義類加載和ClassPath類加載器

訪問 pub 需要 委派 iat 定義 pro logs repl 1 自定義類加載器: 實現規則: 自定義類加載器,需要重寫findClass,然後通過調用loadClass進行類加載(loadClass通過遞歸實現類的雙親委派加載) package com.daxin