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)+"个方法,其中:\n"+ 114 "成功了"+passed+"个方法\n"+ 115 "失败了"+failed+"个方法"); 116 } 117 }
以上就是代码的具体实现,现在对于一些具体的实现和应用还是不太理解,以后再来补充吧。结束。