1. 程式人生 > >JAVA進階-註解

JAVA進階-註解

繼承 false time 指定 java進階 row policy spa bool

註解元數據分為4部分分別為Target,Documented,Inherited,Retention:


Target>指定被註解的註解僅僅能使用在某個類型上;ElementType指定其類型:能夠為方法
字段,類,返回值等等;

聲明:
/**
 * 	@author Lean  @date:2014-10-13  
 */
@Target(ElementType.METHOD)
public @interface WorkInProgress {}

應用:
/**
 * 	@author Lean  @date:2014-10-13  
 */
public class AnnotationSample {
	
	//當在字段中使用時:The annotation @WorkInProgress is disallowed for this location
	[email protected]
/* */ private int age; @WorkInProgress public static boolean doSomeThing() { // TODO Auto-generated method stub return false; } }
Retention>設置註解可見性;使用到RetentionPolicy枚舉
RetentionPolicy.SOURCE>>編譯器可見,但對.class文件和執行時不可見;
RetentionPolicy.CLASS>>默認工具可見,對.class文件可見,但執行不可見;
RetentionPolicy.RUNTIME>>執行時可見;不會被.class文件所知,在執行時告訴JVM的值;
下面樣例為執行時內省檢查,當一個元註解須要多個限定值的時,必須使用{}和逗號隔開,
[email protected]
/* */({ElementType.METHOD,ElementType.TYPE})
/**
 * 	@author Lean  @date:2014-10-13  
 */
@WorkInProgress
public class AnnotationSample {
	
	private int age;
	
	@WorkInProgress
	public static boolean doSomeThing() {
		// TODO Auto-generated method stub
		return false;
	}
	
	public static void main(String[] args) {
		AnnotationSample obj=new AnnotationSample();
		Class clazz=obj.getClass();
		WorkInProgress progress=(WorkInProgress) clazz.getAnnotation(WorkInProgress.class);
		System.out.println(clazz.getName());
		if (clazz.isAnnotationPresent(WorkInProgress.class)) {
			System.out.println("class Annotationed WorkInProgress!");
		}
		Method[] methods=clazz.getMethods();
		for (Method method : methods) {
			if (method.isAnnotationPresent(WorkInProgress.class)) {
				System.out.println("method Annotationed WorkInProgress!");
			}	
		}
	}
	
}


@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
@interface WorkInProgress {}


Documented>為加入註解的類書寫文檔,編譯執行後執行javadoc的dos命令.就可以在該命令行

位置看到所生成的文檔.

Inherited>當對某個類進行註解的時候,希望對繼承他的子類也進行註解.默認情況下
[email protected],系統會覺得子類不須要繼承該功能,例如以下:

/**
 * 	@author Lean  @date:2014-10-13  
 */
@WorkInProgress
public class AnnotationSample {
	
	public static void main(String[] args) throws IllegalAccessException {
		AnnotationSample obj=new AnnotationSample();
		Class clazz=obj.getClass();
		if (clazz.isAnnotationPresent(WorkInProgress.class)) {
			System.out.println("class Annotationed WorkInProgress!");
		}
		Class childClass=AnnotationChildClass.class;
		if (childClass.isAnnotationPresent(WorkInProgress.class)) {
			System.out.println("child class Annotationed WorkInProgress!");
		}
		
	}
	
}


@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
@interface WorkInProgress {}


class AnnotationChildClass extends AnnotationSample{
	
}

JAVA進階-註解