目录
单元测试
就是针对最小的功能单元:方法,编写测试代码对其进行正确性测试
Junit单元测试框架
优点:
- 可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键完成对全部方法的自动化测试,且各自独立
- 不需要去分析测试的结果,会自动生成测试报告出来
具体步骤
- 将Junit框架的jar包导入到项目中
- 为需要测试的业务类,定义对应的测试类,并为每个业务方法,编写对应的测试方法(公共、无参、无返回值)
- 测试方法上必须声明@Test注解,然后在测试方法中,编写代码调用被测试的业务方法进行测试
- 开始测试:选中测试方法,右键选择“Junit运行”,如果测试通过则是绿色;失败则是红色。
反射
反射:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)。
- 加载类,获取类的字节码:class对象
- 获取类的构造器:Constructor对象
- 获取类的成员变量:Field对象
- 获取类的成员方法:Method对象
获取Class对象
三种方式
Class c1 = 类名.class
调用Class提供方法:public static Class forName(String package);
Object提供的方法:public Class getClass(); Class c3 = 对象.getClass();
Student是提前写好的一个类
1、获取类本身:类.class
Class c1 = Student.class;
2、获取类本身:Class.forName("类的全类名")
Class c2 = Class,forName("全类名");
3、获取类本身:对象.getClass()
Student s = new Student();
Class c3 = s.getClass();
反射获取类中的成分并操作
public void getClassInfo(){
//目标:获取类的信息
//1、反射第一步:获取Class对象,代表拿到类
Class c1 = Student.ckass;
System.out.println(c1.getName());//类名的全类名
System.out.println(c1.getSimpleName());//类名:Student
}
//2、获取类的构造器对象并对其进行操作
public void getConstructorInfo(){
//目标:获取类的构造器对象并对其进行操作
//1、反射第一步:获取Class对象,代表拿到类
Class c1 = Student.ckass;
//2、获取构造器对象
Constructor[] cons = c1.getDeclaredConstructors();
for ( Constructor con : cons) {
System.out.println(con.getName() + "(" + con.getParameterCount() + ")");
}
//3、获取单个构造器
Constructor con = c1.getDeclaredConstructor();//无参数构造器
System.out.println(con.getName() + "(" + con.getParameterCount() + ")");
Constructor con2 = c1.getDeclaredConstructor(String.class, int.class);//有参数构造器
System.out.println(con.getName() + "(" + con.getParameterCount() + ")");
//4、获取构造器的作用依然是创建对象,创建对象
//暴力反射:暴力反射可以访问私有构造器,直接访问
con.setAccessible(true);//绕过访问权限,直接访问
Dog d1 = (Dog) con.newInstance();
System/put.println(d1);
}
//2、获取类的成员变量对象并对其进行操作
public void getFieldInfo(){
//目标:获取类的构造器对象并对其进行操作
//1、反射第一步:获取Class对象,代表拿到类
Class c1 = Dog.ckass;
//2、获取成员变量对象
Field[] fields = c1.getDeclaredFields();
for ( Field filed : fields) {
System.out.println(field.getName() + "(" + field.getType().getName() + ")");
}
//3、获取单个成员变量对象
Field field = c1.getDeclaredField("hobby");
System.out.println(field.getName() + "(" + field.getType().getName() + ")");
}
invoke();触发某个对象的该方法执行
setAccessible(true);暴力反射。
作用、应用场景
可以得到一个类的全部成分然后操作
可以破坏封装性
可以绕过泛型的约束
反射是做框架的通用技术
注解
概述
java代码里特殊标记,比如:@Override、@Test等,作用:让其他程序根据注解信息来决定怎么执行该程序。
自定义注解
public @interface 注解名称 {
public 属性类型 属性名() default 默认值;
}
特殊属性名:value
如果注解中只有一个value属性,使用注解时,value名称可以不写
元注解
注解注解的注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Test {
}
@Target:声明被修饰的注解只能在哪些位置使用
@Retention:声明注解的保留周期
注解的解析
判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来。
要解析谁上面的注解,就应该先拿到谁。