爲註解增長各類屬性

1、爲註解增長基本屬性

    一、定義基本類型的屬性和應用屬性 

        在註解類中增長String color(); 

        @MyAnnotation(color="red")

    二、用反射方式得到註解對應的實例對象後,再經過該對象調用屬性對應的方法

MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class); 

System.out.println(a.color()); 

能夠認爲上面這個@MyAnnotation是MyAnnotaion類的一個實例對象

    三、爲屬性指定缺省值

String color() default "yellow";

    四、value屬性

String value() default "zxx"; 
若是註解中有一個名稱爲value的屬性,且你只想設置value屬性(即其餘屬性都採用默認值或者你只有一個value屬性),那麼能夠省略value=部分,例如:@MyAnnotation("lhm")。

二 、爲註解增長高級屬性

    一、數組類型的屬性

int [] arrayAttr() default {1,2,3};
@MyAnnotation(arrayAttr={2,3,4})
若是數組屬性中只有一個元素,這時候屬性值部分能夠省略大括

    二、枚舉類型的屬性

EnumTest.TrafficLamp lamp() ;
@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)

    三、註解類型的屬性

MetaAnnotation annotationAttr() default @MetaAnnotation("xxxx");
@MyAnnotation(annotationAttr=@MetaAnnotation(「yyy」) )
能夠認爲上面這個@MyAnnotation是MyAnnotaion類的一個實例對象,一樣的道理,能夠認爲上面這個@MetaAnnotation是MetaAnnotation類的一個實例對象,調用代碼以下:
	MetaAnnotation ma =  myAnnotation.annotationAttr();
	System.out.println(ma.value());

3、代碼說明

    一、LH.java

package staticimport.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import staticimport.enums.TrafficEnumTest;

@Retention(RetentionPolicy.RUNTIME)//元註解
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface LH {
	//字符串類型,帶默認值
	String color() default "red";
	//字符串類型
	String value();
	//整型數組類型,帶默認值
	int[] arrayAttr() default {1,2,3};
	
	//枚舉類型,帶默認值
	TrafficEnumTest.TrafficLampEnum lamp() default TrafficEnumTest.TrafficLampEnum.YELLOW;
	//註解類型,帶默認值
	MetaAnnotation annotation() default @MetaAnnotation("xyz");
	
	//Class類型,帶默認值
	Class<?> clazzAttr() default String.class;
}

    二、AnnotationTest.java

package staticimport.annotation;

//只有一個value屬性值須要賦值,能夠省略value=
//數組屬性值只有一個,能夠省略{}
@LH(color = "yellow", value = "abc", arrayAttr = 5, annotation = @MetaAnnotation("xxx"), clazzAttr = AnnotationTest.class)
@SuppressWarnings("deprecation")
public class AnnotationTest {

	public static void main(String[] args) {
		System.runFinalizersOnExit(true);
		AnnotationTest.sayHello();

		if (AnnotationTest.class.isAnnotationPresent(LH.class)) {
			LH lh = (LH) AnnotationTest.class.getAnnotation(LH.class);
			System.out.println(lh);
			System.out.println(lh.color());
			System.out.println(lh.value());
			System.out.println(lh.arrayAttr().length);
			System.out.println(lh.lamp().nextLamp());
			System.out.println(lh.annotation().value());
			System.out.println(lh.clazzAttr());
		}

	}

	// 標註本方法已過期,提示用戶不要再使用!但不影響已經使用的!
	@Deprecated
	@LH("kkk")
	public static void sayHello() {
		System.out.println("Hello,LH!");
	}

}

    三、MetaAnnotation.java

package staticimport.annotation;

public @interface MetaAnnotation {
	String value();
}

    注:java

        註解屬性類型能夠是8大基本數據類型、String、Class及其調用類型、枚舉、註解、基本數據類型數組數組

相關文章
相關標籤/搜索