1. 程式人生 > >java註解試用及通過反射讀取值

java註解試用及通過反射讀取值

第一步
建立一個註解介面
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
     public abstract String name() default "";// 預設值為“”
     
   
}
  @Target是註解型別
 1.CONSTRUCTOR:用於描述構造器
 2.FIELD:用於描述域
 3.LOCAL_VARIABLE:用於描述區域性變數
 4.METHOD:用於描述方法
 5.PACKAGE:用於描述包
 6.PARAMETER:用於描述引數
 7.TYPE:用於描述類、介面(包括註解型別) 或enum宣告
   @Retention
定義了該Annotation被保留的時間長短:某些Annotation僅出現在原始碼中,而被編譯器丟棄;而另一些卻被編譯在class檔案中;編譯在class檔案中的Annotation可能會被虛擬機器忽略,而另一些在class被裝載時將被讀取(請注意並不影響class的執行,因為Annotation與class在使用上是被分離的)。使用這個meta-Annotation可以對 Annotation的“生命週期”限制。

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

  取值(RetentionPoicy)有:

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

第二步
用Java反射寫一個工具類讀取註解
public class AnUtils {
   
     public static void getFruitInfo(Class<?> clazz){
           
            String strFruitName=" 水果名稱:";
         
          
            Field[] fields = clazz.getDeclaredFields();
            //@Target=FIELD 執行
            for(Field field :fields){
                if(field.isAnnotationPresent(Fruit.class)){
                    Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
                    strFruitName=strFruitName+fruitName.name();
                    System.out.println(strFruitName);
                }
             
            }
            //   //@Target=

TYPE  執行

              if(clazz.isAnnotationPresent(Fruit.class)){
                Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
                strFruitName=strFruitName+fruitName.name();
                System.out.println(strFruitName);
            }
        }
   
}

第三步
寫個測試類
@Target=TYPE時

@Fruit(name="123")

public class AnnotionTest {
   
    public static  String name;
    public static void main(String[] args) {
      
        AnUtils.getFruitInfo(AnnotionTest.class);
    }
}

輸出: 水果名稱:123
@Target=FIELD時
public class AnnotionTest {
    @Fruit(name="123")
    public static  String name;
    public static void main(String[] args) {
      
        AnUtils.getFruitInfo(AnnotionTest.class);
    }
}

第一步
建立一個註解介面
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
     public abstract String name() default "";// 預設值為“”
     
   
}
  @Target是註解型別
 1.CONSTRUCTOR:用於描述構造器
 2.FIELD:用於描述域
 3.LOCAL_VARIABLE:用於描述區域性變數
 4.METHOD:用於描述方法
 5.PACKAGE:用於描述包
 6.PARAMETER:用於描述引數
 7.TYPE:用於描述類、介面(包括註解型別) 或enum宣告
   @Retention定義了該Annotation被保留的時間長短:某些Annotation僅出現在原始碼中,而被編譯器丟棄;而另一些卻被編譯在class檔案中;編譯在class檔案中的Annotation可能會被虛擬機器忽略,而另一些在class被裝載時將被讀取(請注意並不影響class的執行,因為Annotation與class在使用上是被分離的)。使用這個meta-Annotation可以對 Annotation的“生命週期”限制。

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

  取值(RetentionPoicy)有:

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

第二步
用Java反射寫一個工具類讀取註解
public class AnUtils {
   
     public static void getFruitInfo(Class<?> clazz){
           
            String strFruitName=" 水果名稱:";
         
          
            Field[] fields = clazz.getDeclaredFields();
            //@Target=FIELD 執行
            for(Field field :fields){
                if(field.isAnnotationPresent(Fruit.class)){
                    Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
                    strFruitName=strFruitName+fruitName.name();
                    System.out.println(strFruitName);
                }
             
            }
            //   //@Target=TYPE  執行

              if(clazz.isAnnotationPresent(Fruit.class)){
                Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
                strFruitName=strFruitName+fruitName.name();
                System.out.println(strFruitName);
            }
        }
   
}

第三步
寫個測試類
@Target=TYPE時

@Fruit(name="123")

public class AnnotionTest {
   
    public static  String name;
    public static void main(String[] args) {
      
        AnUtils.getFruitInfo(AnnotionTest.class);
    }
}

輸出: 水果名稱:123
@Target=FIELD時
public class AnnotionTest {
    @Fruit(name="123")
    public static  String name;
    public static void main(String[] args) {
      
        AnUtils.getFruitInfo(AnnotionTest.class);
    }
}

第一步
建立一個註解介面
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
     public abstract String name() default "";// 預設值為“”
     
   
}
  @Target是註解型別
 1.CONSTRUCTOR:用於描述構造器
 2.FIELD:用於描述域
 3.LOCAL_VARIABLE:用於描述區域性變數
 4.METHOD:用於描述方法
 5.PACKAGE:用於描述包
 6.PARAMETER:用於描述引數
 7.TYPE:用於描述類、介面(包括註解型別) 或enum宣告
   @Retention定義了該Annotation被保留的時間長短:某些Annotation僅出現在原始碼中,而被編譯器丟棄;而另一些卻被編譯在class檔案中;編譯在class檔案中的Annotation可能會被虛擬機器忽略,而另一些在class被裝載時將被讀取(請注意並不影響class的執行,因為Annotation與class在使用上是被分離的)。使用這個meta-Annotation可以對 Annotation的“生命週期”限制。

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

  取值(RetentionPoicy)有:

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

第二步
用Java反射寫一個工具類讀取註解
public class AnUtils {
   
     public static void getFruitInfo(Class<?> clazz){
           
            String strFruitName=" 水果名稱:";
         
          
            Field[] fields = clazz.getDeclaredFields();
            //@Target=FIELD 執行
            for(Field field :fields){
                if(field.isAnnotationPresent(Fruit.class)){
                    Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
                    strFruitName=strFruitName+fruitName.name();
                    System.out.println(strFruitName);
                }
             
            }
            //   //@Target=TYPE  執行

              if(clazz.isAnnotationPresent(Fruit.class)){
                Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
                strFruitName=strFruitName+fruitName.name();
                System.out.println(strFruitName);
            }
        }
   
}

第三步
寫個測試類
@Target=TYPE時

@Fruit(name="123")

public class AnnotionTest {
   
    public static  String name;
    public static void main(String[] args) {
      
        AnUtils.getFruitInfo(AnnotionTest.class);
    }
}

輸出: 水果名稱:123
@Target=FIELD時
public class AnnotionTest {
    @Fruit(name="123")
    public static  String name;
    public static void main(String[] args) {
      
        AnUtils.getFruitInfo(AnnotionTest.class);
    }
}第一步
建立一個註解介面
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
     public abstract String name() default "";// 預設值為“”
     
   
}
  @Target是註解型別
 1.CONSTRUCTOR:用於描述構造器
 2.FIELD:用於描述域
 3.LOCAL_VARIABLE:用於描述區域性變數
 4.METHOD:用於描述方法
 5.PACKAGE:用於描述包
 6.PARAMETER:用於描述引數
 7.TYPE:用於描述類、介面(包括註解型別) 或enum宣告
   @Retention定義了該Annotation被保留的時間長短:某些Annotation僅出現在原始碼中,而被編譯器丟棄;而另一些卻被編譯在class檔案中;編譯在class檔案中的Annotation可能會被虛擬機器忽略,而另一些在class被裝載時將被讀取(請注意並不影響class的執行,因為Annotation與class在使用上是被分離的)。使用這個meta-Annotation可以對 Annotation的“生命週期”限制。

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

  取值(RetentionPoicy)有:

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

第二步
用Java反射寫一個工具類讀取註解
public class AnUtils {
   
     public static void getFruitInfo(Class<?> clazz){
           
            String strFruitName=" 水果名稱:";
         
          
            Field[] fields = clazz.getDeclaredFields();
            //@Target=FIELD 執行
            for(Field field :fields){
                if(field.isAnnotationPresent(Fruit.class)){
                    Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
                    strFruitName=strFruitName+fruitName.name();
                    System.out.println(strFruitName);
                }
             
            }
            //   //@Target=TYPE  執行

              if(clazz.isAnnotationPresent(Fruit.class)){
                Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
                strFruitName=strFruitName+fruitName.name();
                System.out.println(strFruitName);
            }
        }
   
}

第三步
寫個測試類
@Target=TYPE時

@Fruit(name="123")

public class AnnotionTest {
   
    public static  String name;
    public static void main(String[] args) {
      
        AnUtils.getFruitInfo(AnnotionTest.class);
    }
}

輸出: 水果名稱:123
@Target=FIELD時
public class AnnotionTest {
    @Fruit(name="123")
    public static  String name;
    public static void main(String[] args) {
      
        AnUtils.getFruitInfo(AnnotionTest.class);
    }
}

輸出: 水果名稱:123