Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 中的类、构造器、方法、成员变量、参数等都可以被注解进行标注。例如JUnit单元测试中的@Test方法,可以使得方法直接运行。
JUnit单元测试@Test
单元测试是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法。单元测试就是针对Java方法的测试,进而检查方法的正确性。目前测试方法在只有一个main方法,如果一个方法的测试失败了,其他方法测试会受到影响。而且无法得到测试的结果报告,需要程序员自己去观察测试是否成功。也无法实现自动化测试。
JUnit是使用Java语言实现的开源单元测试框架。
使用test需要 1.导入JUnit包。
随便写一个类:
2.测试方法必须是公共的无参数无返回值的非静态方法。3.在测试方法上使用@Test注解。4.在测试方法中完成被测试方法的预期正确性测试。5.选中测试方法,运行。
Junit常用注解
@Test |
测试方法 |
@Before |
用来修饰实例方法,该方法会在每一个测试方法执行之前执行一次。 |
@After |
用来修饰实例方法,该方法会在每一个测试方法执行之后执行一次。 |
@BeforeClass |
用来静态修饰方法,该方法会在所有测试方法之前只执行一次。 |
@AfterClass |
用来静态修饰方法,该方法会在所有测试方法之后只执行一次。 |
注解-自定义注解
注解就是对Java中类、方法、成员变量做标记,然后进行特殊处理。自定义注解就是自己做一个注解来使用。
格式: public @interface 注解名称 { public 属性类型 属性名() default 默认值 ;}
两个元注解,用于注解 注解 的:
@Target: 约束自定义注解只能在哪些地方使用,
Target中可使用的值定义在ElementType枚举类中,常用值如下 :
TYPE,类,接口
FIELD, 成员变量
METHOD, 成员方法
PARAMETER, 方法参数
CONSTRUCTOR, 构造器
LOCAL_VARIABLE, 局部变量
@Retention:申明注解的生命周期
常用值如下 :
SOURCE: 注解只作用在源码阶段,生成的字节码文件中不存在
CLASS: 注解作用在源码阶段,字节码文件阶段,运行阶段不存在,默认值.
RUNTIME:注解作用在源码阶段,字节码文件阶段,运行阶段(开发常用)
自定义注解-1格式
//注解 public @interface myAnnotation1 { String name(); String[] names(); } //使用 @myAnnotation1(name = "JavaE",names = {"123","456"}) public class AnnotationD1 { @myAnnotation1(name = "hello",names = {"123","456"}) public static void main(String[] args) { } }
注解解析
注解的操作中经常需要进行解析,注解的解析就是判断是否存在注解。
与注解解析相关的接口:
Annotation: 注解的顶级接口,注解都是Annotation类型的对象
AnnotatedElement:该接口定义了与注解解析相关的解析方法
常用方法:
Annotation[] getDeclaredAnnotations() |
获得当前对象上使用的所有注解,返回注解数组。 |
T getDeclaredAnnotation(Class<T> annotationClass) |
根据注解类型获得对应注解对象 |
boolean isAnnotationPresent(Class<Annotation> annotationClass) |
判断当前对象是否使用了指定的注解,如果使用了则返回true,否则false |
自定义注解-2 模拟JUnit
1.定义一个自定义注解MyTest,只能注解方法,存活范围是一直都在(元注解)。2.定义若干个方法,只要有@MyTest注解的方法就能在启动时被触发执行,没有这个注解的方法不能执行。
@Target({ElementType.METHOD,ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface MyTest { }
public class Demo1 { @MyTest public void test1(){ System.out.println("1"); } public void test2(){ System.out.println("2"); } @MyTest public void test3(){ System.out.println("3"); } public static void main(String[] args) throws Exception{ Demo1 d1=new Demo1(); Class c=Demo1.class;//反射第一步,获取类对象 //获取全部方法 Method[] methods=c.getDeclaredMethods(); for (Method method : methods) {//如果方法存在xx注解 if(method.isAnnotationPresent(MyTest.class)){ method.invoke(d1); } } } }