什么是注解? 英文是annotation
注解的主要作用:对我们的程序进行标注和解释。
注解名 |
说明 |
@Override |
描述子类重写父类的方法 |
@Deprecated |
描述方法过时 |
@SuppressWarnings |
压制警告 |
注解和注释的区别
注释:给程序员看的
注解:给编译器看的(让虚拟机看到程序中的注解,注解代表程序的一些特殊功能)
自定义注解
默认值可以不设置
在使用注解的时候如果注解里面的属性没有指定默认值
那么我们就需要手动给出注解属性的设置值
//特殊属性value 如果我们只设置了value没有默认值,那么在调用注解时,可以省略value字段只给出值value的设置值
代码:
主自定义注解:
public @interface Anno1 { //定义一个基本类型的属性 int a() default 23; //定义一个String类型的属性 public String name() ; //定义一个class类似的属性 public Class clazz() default Anno2.class; //定义一个注解类型的属性 public Anno2 anno() default @Anno2; //定义一个枚举类型的属性 public Season season() default Season.SPRING; //以上类型的一维数组 //int 数组 public int[] arr()default {1,2,3,4,5}; //枚举数组 public Season[] seasons()default {Season.SPRING,Season.SUMMER}; //特殊属性value 如果我们只设置了value没有默认值,那么在调用注解时,可以省略value字段 }
Anno2:
public @interface Anno2 { }
枚举类Season:
public enum Season { SPRING,SUMMER,AUTUMN,WINTER; }
测试类:
@Anno1(name = "libai") public class AnnoTest { }
练习:获取某个类中的所有方法并判断是否有相应注解
注解类:
@Retention(value = RetentionPolicy.RUNTIME) public @interface Test { }
方法类:
public class UseTest { @Test public void method(){ System.out.println("我是method"); } public void function(){ System.out.println("我是function"); } @Test public void show(){ System.out.println("我是show"); } }
测试类:
public class AnnoTest { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException { //通过反射获取UseTest类的字节码文件对象 Class<?> clazz = Class.forName("com.myAnnotation.UseTest"); //创建一个对象 UseTest useTest = new UseTest(); //通过反射获取类中所有非继承方法对象 Method[] methods = clazz.getDeclaredMethods(); //遍历获得每一个方法对象 for (Method method : methods) { //isAnnotationPresent 判断当前方法上是否有指定的注解 //参数为注解的字节码文件对象 //返回值:布尔 if (method.isAnnotationPresent(Test.class)) { method.invoke(useTest); } } } }
元注解:描述注解的注解
如:
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Test { }
元注解名 |
说明 |
@Target |
指定了注解能在哪里使用 |
@Retention |
可以理解为保留时间(生命周期) |
@Inherited |
表示修饰的自定义注解可以被子类继承 |
@Documented |
表示该自定义注解,会出现在API文档里面。 |
@Target ({ElementType.FIELD,ElementType.TYPE,ElementType.METHOD}) 指定注解在哪使用 分别为 变量, 类, 方法
@Retention() 如果不写 表示这个注解只能存活在源码阶段
随意要设置 @Retention(RetentionPolicy.RUNTIME) //让注解活到字节码运行阶段
@Inherited 直接写,就代表这个注解可以被继承
单元测试
以前的测试方式:
我们都是将代码全部写完才进行测试。这样其实不是很好
在以后工作的是后,都是写完一部分代码就测试一部分。这样,带码中的问题可以得到及时修复
也避免了,由于代码过多,从而无法准确定位到错误的代码
Junit概述
JUnit是一个开放源代码的测试工具
提供注解来识别测试方法
JUnit测试可以让你编写代码更快并能提高质量
JUnit优雅简介没那么复杂,花费时间较少
JUnit在一个条中显示进度。如果运行良好则是绿色。运行失败则是红色
Junit使用的基本流程
将JUnit的jar包导入到工程中
编写测试方法测试方法必须是公共的无参数无返回值的非静态方法
在测试方法上使用@Test注解标注该方法是一个测试方法
选中测试方法右键通过junit运行该方法\