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
作用:表示需要在什麼級別儲存該註釋資訊,用於描述註解的生命週期(即:被描述的註解在什麼範圍內有效)
取值(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=
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