java注解(1)

  java中注解是我一直不懂的地方,这次就来复习一下。

  java中有5个基本Annotation(注解)4个元Annotation。五个基本Annotation是为了修饰程序元素,四个元Annotation是为了修饰Annotation的。下面就具体谈一谈。

  五个基本Annotation分别为1.@Override(限定重写父类的方法,必须重写父类的方法),2.@Deprecated(标记已过时),3@SuppressWarnings(抑制编译器警告),4@SafeVarargs(抑制JAVA7的堆污染警告),5@FunctionalInterface(函数式接口)。以上就是五个基本Annotation,在这里不再一一叙述各自的区别,我其实了解也不多,具体的Annotation要结合反射来讲,以后复习完反射在来谈谈吧。

  四个元Annotation分别为1.@Retention(修饰Annotation的存在时间),2.@Target(指定Annotation所修饰的程序),3@Documented(修饰的Annotation会出现在API文档中),4.@Inherited(修饰的Annotation具有继承性)。和上面的一样,这里不再累述。具体的自己可以查阅资料。

  以前,我以为注解的作用不是很大,但是后来在网上看了之后,发现在企业中注解的作用还是比较大的,方便开发者写XML文档,当然还有其他的用处,这里不再列举。下面就具体的写一个例子,方便理解,例子的主要作用就是将测试类中的方法,带有注解的方法会被测试。代码如下:

  1 package AnnotationTrain;
  2 
  3 import java.lang.annotation.ElementType;
  4 import java.lang.annotation.Retention;
  5 import java.lang.annotation.RetentionPolicy;
  6 import java.lang.annotation.Target;
  7 import java.lang.reflect.Method;
  8 
  9 import AnnotationTrain.demo2.Testable;
 10 
 11 public class demo2 {
 12     // 使用JDK的元数据Annotation:@Retention
 13     @Retention(RetentionPolicy.RUNTIME)//修饰注解的存在时间
 14     @Target(ElementType.METHOD)//修饰注解只能修饰方法
 15     public @interface Testable //被修饰的方法
 16     {
 17         //此注解修饰方法,表示只有被标记的方法才可以测试
 18     }
 19     
 20     public static void main(String[] args) throws Exception
 21     {
 22         //这里找类的时候要用类的完全限定名(包名.类名),要不然可能会报错
 23         ProcessorTest.Process("AnnotationTrain.MyTest");
 24     }
 25     
 26 
 27 }
 28 /*
 29  * 
 30  * @ClassName:     MyTest
 31  * @Description:测试用例
 32  * @author:    yanyu
 33  * @date:        2018-5-8 下午1:48:43
 34  *
 35  */
 36 class MyTest
 37 {
 38     @Testable
 39     public static void m1()
 40     {
 41         //有标记
 42     }
 43     
 44     public static void m2()
 45     {
 46         //没有标记
 47     }
 48     @Testable
 49     public static void m3()
 50     {
 51         //拥有标记,还可以抛出异常
 52         throw new IllegalArgumentException("参数出错了");
 53     }
 54     
 55     public static void m4()
 56     {
 57         //没有标记,抛出异常
 58         throw new IllegalArgumentException("参数出错了");
 59     }
 60     
 61     @Testable
 62     public static void m5()
 63     {
 64         //拥有标记,还可以抛出异常
 65         throw new RuntimeException("程序业务出现异常!");
 66     }
 67     
 68     public static void m6()
 69     {
 70         //没有标记,抛出异常
 71         throw new RuntimeException("程序业务出现异常!");
 72     }
 73 }
 74 /*
 75  * 
 76  * @ClassName:     ProcessorTest
 77  * @Description:测试工具类
 78  * @author:    yanyu
 79  * @date:        2018-5-8 下午1:50:02
 80  *
 81  */
 82 class ProcessorTest
 83 {
 84     //测试方法
 85     public static void Process(String clazz) throws ClassNotFoundException
 86     {
 87         //计数器
 88         int passed=0;
 89         int failed=0;
 90         //System.out.print("hah");
 91         //遍历clazz对应的类里的所有方法
 92         for(Method m : Class.forName(clazz).getMethods())
 93         {
 94             //如果该方法使用了@TestTable修饰
 95             if(m.isAnnotationPresent(Testable.class))//这里的判断还是不清楚具体的使用方法
 96             {
 97                 try
 98                 {
 99                     //调用m方法
100                     m.invoke(null);
101                     //方法成功运行,计数器加一
102                     passed++;
103                 }catch (Exception ex) {
104                     // TODO: handle exception
105                     //打印异常
106                     System.out.println("方法"+m+"运行时异常,异常为:"+ex.getCause());
107                     //失败计数器加一
108                     failed++;
109                 }
110             }
111         }
112         //统计测试的结果
113         System.out.println("共运行了"+(passed+failed)+"个方法,其中:
"+
114                 "成功了"+passed+"个方法
"+
115                 "失败了"+failed+"个方法");
116     }
117 }

  以上就是代码的具体实现,现在对于一些具体的实现和应用还是不太理解,以后再来补充吧。结束。