码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA进阶-Annotation

时间:2014-10-13 21:24:26      阅读:386      评论:0      收藏:0      [点我收藏+]

标签:style   color   io   os   使用   ar   java   for   strong   

注解元数据分为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
	//@WorkInProgress
	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的值;
以下例子为运行时内省检查,当一个元注解需要多个限定值的时,必须使用{}和逗号隔开,
如@Target({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>当对某个类进行注解的时候,希望对继承他的子类也进行注解.默认情况下
没有使用该@Inherited注解方式,系统会认为子类不需要继承该功能,如下:

/**
 * 	@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进阶-Annotation

标签:style   color   io   os   使用   ar   java   for   strong   

原文地址:http://blog.csdn.net/qq285016127/article/details/40048871

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!