java自定义Annotation(载自百度文库)

java中自定义annotation需要@interface关键字和用到几个内置annotation。

用到的注解有@Target,@Retention,@Documented,@Inherited ,用途如下:
     @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括:

         ElemenetType.CONSTRUCTOR 构造器声明 
         ElemenetType.FIELD 域声明(包括 enum 实例)           

   ElemenetType.LOCAL_VARIABLE 局部变量声明           

     ElemenetType.METHOD 方法声明           

    ElemenetType.PACKAGE 包声明      

    ElemenetType.PARAMETER 参数声明 
        ElemenetType.TYPE 类,接口(包括注解类型)或enum声明            
      @Retention 表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括:          

        RetentionPolicy.SOURCE 注解将被编译器丢弃 
        RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃           

        RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。            
     @Documented 将此注解包含在 javadoc 中        
     @Inherited 允许子类继承父类中的注解    
    @Documented的目的就是让这一个Annotation类型的信息能够显示在javaAPI说明文档上;

  没有添加的话,使用javadoc生成API文档的时候就会找不到这一个类型生成的信息.      

     另外一点,如果需要把Annotation的数据继承给子类,那么就会用到@Inherited这一个。  
      下面自定义两个简单的annatation。  package annotation;  
import java.lang.annotation.Documented;  

import java.lang.annotation.ElementType; 

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

  import java.lang.annotation.Target;  
@Target(ElementType.TYPE)
 @Retention(RetentionPolicy.RUNTIME)  @Documented
 public @interface Description {
     String value() default "no description";  

}

package annotation;  
import java.lang.annotation.Documented; 

 import java.lang.annotation.ElementType; 

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

  import java.lang.annotation.Target;  
@Target(ElementType.METHOD)
 @Retention(RetentionPolicy.RUNTIME) 

 @Documented
 public @interface Name {     

 String originate();     

 String community();  

}

 

 package annotation;  
@Description("javaeye, to be best") 

 public class JavaEyer {
     @Name(originate = "创始人:robbin", community = "javaeye")     

 public String getEyeName() {        

  return null;      

}
     @Name(originate = "创始人:江南白衣", community = "springside")     

 public String getSideName() { 

         return "excuse me";     

 } 

 }

 

package annotation;  
import java.lang.reflect.Method; 

 import java.util.HashSet;  import java.util.Set;  
public class AnnotationTest {

 @SuppressWarnings("unchecked")
     public static void main(String[] args) throws ClassNotFoundException {         

 final String CLASS_NAME = "annotation.JavaEyer";          

Class test = Class.forName(CLASS_NAME);          

Method[] methods = test.getMethods();
         boolean flag = test.isAnnotationPresent(Description.class); 

         if (flag) {
             Description des = (Description) test.getAnnotation(Description.class);              

System.out.println("描述:" + des.value());              

System.out.println("-----------------");         

 }
         Set<Method> set = new HashSet<Method>();         

 for (int i = 0; i < methods.length; i++) {
             boolean otherflag = methods[i].isAnnotationPresent(Name.class);             

 if (otherflag) {
                 set.add(methods[i]);             

 }         

 }
         for (Method method : set) {
             Name name = method.getAnnotation(Name.class);   

           System.out.println(name.originate());
             System.out.println("创建的社区:" + name.community());        

  }      

posted @ 2016-07-04 14:35  蚂蚁1  阅读(146)  评论(0编辑  收藏  举报