zoukankan      html  css  js  c++  java
  • JAVA进阶-注解

    注解元数据分为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{
    	
    }

  • 相关阅读:
    场景调研
    手机搜狗输入法体验
    1到一个整数之间1的个数
    寻找水王
    成套卖书最大优惠问题
    面向对象--多态
    抽象类和接口
    面向对象思想--继承
    面向对象思想--封装
    变量和参数传递
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6884028.html
Copyright © 2011-2022 走看看