java Annotation

package com.wangbiao.test;

import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;


/**
 * Annotation
 * @author WangBiao
 *2013-4-28下午05:32:38
 */
public class Test_Annotation {
	// @Retention:註解的保留位置         
	//     @Retention(RetentionPolicy.SOURCE) //註解僅存在於源碼中,在class字節碼文件中不包含
	//     @Retention(RetentionPolicy.CLASS) //
	// 默認的保留策略,註解會在class字節碼文件中存在,但運行時沒法得到,
	//     @Retention(RetentionPolicy.RUNTIME) //
	// 註解會在class字節碼文件中存在,在運行時能夠經過反射獲取到
	//
	// @Target:註解的做用目標
	//       
	//       @Target(ElementType.TYPE) //接口、類、枚舉、註解
	//       @Target(ElementType.FIELD) //字段、枚舉的常量
	//       @Target(ElementType.METHOD) //方法
	//       @Target(ElementType.PARAMETER) //方法參數
	//       @Target(ElementType.CONSTRUCTOR) //構造函數
	//       @Target(ElementType.LOCAL_VARIABLE)//局部變量
	//       @Target(ElementType.ANNOTATION_TYPE)//註解
	//       @Target(ElementType.PACKAGE) ///包
	//
	// @Document:說明該註解將被包含在javadoc中
	//
	// @Inherited:說明子類能夠繼承父類中的該註解
	
	public static void getAnnotationContent() throws Exception{
		Class c=Class.forName("com.wangbiao.test.A");
		Method m=c.getMethod("getName");
		if(m.isAnnotationPresent(MyAnnotation_third.class)){
			MyAnnotation_third an=m.getAnnotation(MyAnnotation_third.class);
			String name=an.name();
			int age=an.age();
			System.out.println(name+"-"+age);
		}
	}
	@SuppressWarnings({"unchecked","deprecation"})
	public static void main(String[] args) throws Exception {
		A a=new A();
		a.setName("test");
		System.out.println(a.getName());
		
//		Class c=Class.forName("com.wangbiao.test.A");
//		Method m=c.getMethod("getName");
//		Annotation[] as=m.getAnnotations();
//		for (Annotation annotation : as) {
//			System.out.println(annotation);
//		}
		
		getAnnotationContent();
	}
}

@Deprecated
@MyAnnotation_first(value={"test","good"})
@MyAnnotation_second(name="test")
@MyAnnotation_third(name="test",age=20)

class A<T>{
	private T name;
	
	@Deprecated
	@MyAnnotation_first(value={"test","good"})
	@MyAnnotation_second(name="test")
	@MyAnnotation_third(name="test",age=20)
	public T getName() {
		return name;
	}

	public void setName(T name) {
		this.name = name;
	}
	
}
//註解的保存範圍
@Retention(value=RetentionPolicy.RUNTIME)
@interface MyAnnotation_first{
	public String[] value();
}

@interface MyAnnotation_second{
	public String name();//必須加一個括號
}
//若是Retention不是RetentionPolicy.RUNTIME,則取不到這個annotation
@Retention(value=RetentionPolicy.RUNTIME)
//@Target(value=ElementType.TYPE)//定義註解的位置
@interface MyAnnotation_third{
	public String name() default "zhangsan";//必須加一個括號
	public int age() default 20;
}
相關文章
相關標籤/搜索