1. 程式人生 > >java中自定義註解並通過反射獲取註解屬性值

java中自定義註解並通過反射獲取註解屬性值

直接上程式碼,註釋中有說明:

1、定義自定義註解類(類註解和欄位註解)

  1. package com.uno.ray;  
  2. import java.lang.annotation.Documented;  
  3. import java.lang.annotation.ElementType;  
  4. import java.lang.annotation.Inherited;  
  5. import java.lang.annotation.Retention;  
  6. import java.lang.annotation.RetentionPolicy;  
  7. import
     java.lang.annotation.Target;  
  8. import java.net.Authenticator.RequestorType;  
  9. /** 
  10.  * 自定義註解 
  11.  * @author Uno 
  12.  *@Documented:指明該註解可以用於生成doc 
  13.  *@Inherited:該註解可以被自動繼承 
  14.  *@Retention:指明在什麼級別顯示該註解: 
  15.  *  RetentionPolicy.SOURCE 註解存在於原始碼中,編譯時會被拋棄 
  16.     RetentionPolicy.CLASS 註解會被編譯到class檔案中,但是JVM會忽略 
  17.     RetentionPolicy.RUNTIME JVM會讀取註解,同時會儲存到class檔案中
     
  18.   @Target:指明該註解可以註解的程式範圍 
  19.     ElementType.TYPE 用於類,介面,列舉但不能是註解 
  20.     ElementType.FIELD 作用於欄位,包含列舉值 
  21.     ElementType.METHOD 作用於方法,不包含構造方法 
  22.     ElementType.PARAMETER 作用於方法的引數 
  23.     ElementType.CONSTRUCTOR 作用於構造方法 
  24.     ElementType.LOCAL_VERIABLE 作用於本地變數或者catch語句 
  25.     ElementType.ANNOTATION_TYPE 作用於註解
     
  26.     ElementType.PACKAGE 作用於包 
  27.  */
  28. @Documented
  29. @Inherited
  30. @Retention(RetentionPolicy.RUNTIME)  
  31. @Target({ElementType.TYPE, ElementType.FIELD})//次註解作用於類和欄位上
  32. public@interface FieldTypeAnnotation {  
  33.     /** 
  34.      *leip 2016年12月3日 
  35.      *TODO 
  36.     **/
  37.     String type() default"ignore";  
  38.     int age() default27;  
  39.     String[] hobby(); //沒有指定defalut的,需要在註解的時候顯式指明
  40. }  
2、(方法註解)
  1. package com.uno.ray;  
  2. import java.lang.annotation.Documented;  
  3. import java.lang.annotation.ElementType;  
  4. import java.lang.annotation.Inherited;  
  5. import java.lang.annotation.Retention;  
  6. import java.lang.annotation.RetentionPolicy;  
  7. import java.lang.annotation.Target;  
  8. /** 
  9.  *  
  10.  * @author Uno 
  11.  * 
  12.  */
  13. @Documented
  14. @Inherited
  15. @Retention(RetentionPolicy.RUNTIME)  
  16. @Target(ElementType.METHOD) //次註解只能作用於方法上
  17. public@interface MethodAnnotation {  
  18.     String desc() default"method1";  
  19. }  

3、定義測試類:(反射類)
  1. package com.uno.ray;  
  2. import java.awt.Dialog.ModalityType;  
  3. import java.lang.reflect.Field;  
  4. import java.lang.reflect.Method;  
  5. import java.util.Arrays;  
  6. @FieldTypeAnnotation(type = "class", hobby = { "smoke" })  
  7. publicclass ReflectAnnotation {  
  8.     /** 
  9.      * leip 2016年12月3日 TODO 
  10.      **/
  11.     @FieldTypeAnnotation(hobby = { "sleep""play" })  
  12.     private String maomao;  
  13.     @FieldTypeAnnotation(hobby = { "phone""buy" }, age = 27, type = "normal")  
  14.     private String zhangwenping;  
  15.     @MethodAnnotation()  
  16.     publicvoid method1() {  
  17.     }  
  18.     @MethodAnnotation(desc="method2")  
  19.     publicvoid method2() {  
  20.     }  
  21.     publicstaticvoid main(String[] args) {  
  22.         // 此處要用反射將欄位中的註解解析出來
  23.         Class<ReflectAnnotation> clz = ReflectAnnotation.class;  
  24.         // 判斷類上是否有次註解
  25.         boolean clzHasAnno = clz.isAnnotationPresent(FieldTypeAnnotation.class);  
  26.         if (clzHasAnno) {  
  27.             // 獲取類上的註解
  28.             FieldTypeAnnotation annotation = clz.getAnnotation(FieldTypeAnnotation.class);  
  29.             // 輸出註解上的屬性
  30.             int age = annotation.age();  
  31.             String[] hobby = annotation.hobby();  
  32.             String type = annotation.type();  
  33.             System.out.println(clz.getName() + " age = " + age + ", hobby = " + Arrays.asList(hobby).toString() + " type = " + type);  
  34.         }  
  35.         // 解析欄位上是否有註解
  36.         // ps:getDeclaredFields會返回類所有宣告的欄位,包括private、protected、public,但是不包括父類的
  37.         // getFields:則會返回包括父類的所有的public欄位,和getMethods()一樣
  38.         Field[] fields = clz.getDeclaredFields();  
  39.         for(Field field : fields){  
  40.             boolean fieldHasAnno = field.isAnnotationPresent(FieldTypeAnnotation.class);  
  41.             if(fieldHasAnno){  
  42.                 FieldTypeAnnotation fieldAnno = field.getAnnotation(FieldTypeAnnotation.class);  
  43.                 //輸出註解屬性
  44.                 int age = fieldAnno.age();  
  45.                 String[] hobby = fieldAnno.hobby();  
  46. 相關推薦

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

    直接上程式碼,註釋中有說明: 1、定義自定義註解類(類註解和欄位註解): package com.uno.ray;   import java.lang.annotation.Documented;   import java.lang

    Java定義註解通過反射獲取註解

    tco element pos pri jvm ado 參數聲明 機制 world 一、註解基本知識   1、元註解:@Retention @Target @Document @Inherited   2、Annotation型定義為@interface, 所有的Annot

    java @interface定義註解通過反射獲取註解屬性

    @interface @interface用來宣告一個註解,其中的每一個方法實際上是聲明瞭一個配置引數。 方法的名稱就是引數的名稱,返回值型別就是引數的型別 引數型別只能是基本型別、Class、String、enum。 可以通過default來宣告引數的

    在多執行緒使用匿名類通過反射獲取屬性

    標題挺彆扭的,至少我對這些高階技術瞭解的還很少,繼續學習吧...初次接觸匿名類感覺很爽,簡化了程式碼量(可能有些時候還真需要它) 控制檯的程式碼 using System.Collections.Generic; using System.Linq; using Sys

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

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

    定義註解通過反射獲得註解(詳細定義註解解釋)

    lean ner interface 子類 cts clas def EDA 通過 自定義註解(@Alias): package com.nf.lc.demo3; import java.lang.annotation.*; /* 定義註解的生命周期元註解:@

    Java定義註解

    隨著 java註解 can 中文名 fault rev 相同 val source 前言 隨著springboot的流行,以前基於XML的spring配置用的越來越少,JavaConfig形式使用的越來越多,類似於: @Configuration

    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.

    java定義註解@interface在定義校驗器validator的使用

    一,自定義註解中元註解1,保留位置:Retention    1.1 @Retention(RetentionPolicy.SOURCE) //僅存在於原始碼中,在class位元組碼檔案中不存在    1.2 @Retention(RetentionPolicy.CLASS)

    java 通過反射獲取註解

    使用反射獲取某個類的註釋、方法上的註釋、屬性上的註釋。 import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; import javax.x

    java定義封裝json以及和物件的轉換

    首先建立服務端返回的資料型別物件: package com.studio.pojo.util; import org.codehaus.jackson.map.ObjectMapper; publ

    Java定義物件使用Collections工具類的Sort方法

    Collections工具類中的sort方法有兩種形式: (1) sort(List<T> list) (2) sort(List<T> list, Comparator<? super T> c) 第一種方法中List型別的物件必須實現Comparable介面,此外,

    java定義使用{0}佔位符功能之MessageFormat類

    MessageFormat提供一種語言無關的方式來組裝訊息,它允許你在執行時刻用指定的引數來替換掉訊息字串中的一部分。你可以為MessageFormat定義一個模式,在其中你可以用佔位符來表示變化的部分,例如在下面的測試類中: package cn.lz.life.uti

    java定義時間減去某幾天返回減去的天數時間

    <span style="font-size:18px;"><span style="white-space:pre"> </span>//減去多少天 String remindNo="5"; String dateTime="

    關於Java定義包的建立

    我在學習thinking in Java4 的時候,在建立自定義包的時候,碰到了很多錯誤,讓我鬱悶了幾天,通過在網上的資料搜尋,把包的建立過程給大家詳細列出來。 我們以thinking in Java4中的例子為例 建立兩個類Vector和List。將編譯後的Vector

    java定義鎖實現synchronized功能

    public class Test {private static long count = 0;private Lock lock = new Lock();private int m = 0;private int a = 0;private int b = 0;pub

    Java定義異常的兩種處理方法

    其中註釋掉的部分就是處理方法之一 class DivisorIsZeroException extends Exception { public DivisorIsZeroException(Str

    Java定義異常

            今天覆習了一下Java中的異常處理,折騰了一下。都知道,在Java應用程式中,對異常的處理有兩種方式:處理異常和宣告異常。處理異常使用try-catch-finally捕獲異常,宣告異常則需要將其新增到方法名結束的位置(throws)。異常分為三種:可檢測異

    java定義列舉enum對映到mysql資料庫欄位處理器handler

    今年企業對Java開發的市場需求,你看懂了嗎? >>>