一,单元测试
单元测试就是针对最小功能单元编写测试代码,java程序最小的功能单元是方法。
Junit单元测试框架(开源)
很普遍的一种测试框架,所以IDE工具都集成了Junit。
优点
可以灵活选择执行那些测试方法,可以一键执行全部测试方法
可以生产全部方法测试报告,如哪些成功哪些失败
如果某个方法测试失败了,不会影响其他方法的测试快速使用
-
将Junit的jar包导入到项目中,一般ide中都自动会包含
2.编写测试方法,方法必须是公共的无参的无返回值的非静态方法
3.在测试方法上加@test注解,表示是一个测试方法
4.在测试方法中完成被测试方法的预期正确性测试
5.选中测试方法 Junit运行 ,绿色表示成功,红色表示失败
- 单元测试中的常用注解
1 @Test测试方法
2 @Before 修饰实例方法,每一个测试方法之前执行一次
3 @After 修饰实例方法,每一个测试方法之后执行一次
4 @/BeforeClass用来静态修饰方法,所有测试方法之前只执行一次
5 @AfterClass 用来静态修饰方法,所有测试方法之后只执行一次
开始执行的方法,初始化资源
执行完之后方法,释放资源
二,反射
对于任何一个class类,在运行的时候都可以直接得到这个类的全部成分
y
2.1第一步获取class类对象
//第一步获取class类对象 3种方法
//方法1 class类中静态方法forName拿
Class c = Class.forName("com.hx.reflect.Student");
System.out.println(c);
//方法2 类名.class
Class c1 = Student.class;
//方法3 对象.getClass() 获取对象对应类的class对象
Student s = new Student();
Class c2 = s.getClass();
2.2第二步获取构造器对象
1.只能拿public修饰的构造器
//第一步获取class类对象
Class c = Class.forName("com.hx.reflect.Student");
//从类对象中获取构造器对象
Constructor[] constructor = c.getConstructors();
//遍历构造器
for (Constructor constructor1 : constructor) {
System.out.println(constructor1.getName()+"==>" +constructor1.getParameterCount());//getName:构造器名称 getParameterCount:参数个数
}
2 所有构造器都可以拿 无论私有公有
//第一步获取class类对象
Class c = Class.forName("com.hx.reflect.Student");
//从类对象中获取构造器对象
Constructor[] constructor = c.getDeclaredConstructors();
//遍历构造器
for (Constructor constructor1 : constructor) {
System.out.println(constructor1.getName()+"==>" +constructor1.getParameterCount());
}
3 获取某一个构造器
Constructor constructor = c.getConstructor;
4 获取某个有参构造器
Constructor constructor = c.getConstructor(String,class,int.class,Float.class);
2.3 第三步拿构造器目的初始化一个对象返回
constructor.setAccessible(true);遇到私有构造器可权限可强制打开
Student s = (Student) constructor .newInstance();
2.4 获取成员变量对象
//定位class对象
Class c = Class.forName("com.hx.reflect.Student");
//定位全部成员变量
Field[] fields = c.getDeclaredFileds();
//遍历
for(Field field:fields){
sout(field.getName(),field.getType())//名字和类型
}
给成员变量赋值
//定位class对象
Class c = Class.forName("com.hx.reflect.Student");
//提取某个成员变量
Field name = c.getDeclaredFiled("age");
//打开私有权限
name.setAccessible(true);
// 赋值
Student s = new Student();
name(s,"侯旭");
//取值
String rs = (String)name.get(s);
2.5获取方法对象
//定位class对象
Class c = Class.forName("com.hx.reflect.Student");
//获取全部方法,包括私有的
Method[] methods = c.getDeclaredMethods();
//然后fou循环遍历
//触发方法执行
Dog d = new Dog();
method.invoke(method);
2.6绕过编译阶段为集合添加数据
反射是作用在运行时的技术,集合泛型不能产生约束了,此时可以为集合存入其他类型的元素
ArrayList<String> list = new ArrayList<>();
list.add(1254);//报错
list.add("我和你简单");
2.7通用框架底层原理
泛型只是在编译阶段约束,在编译成class文件进入运行阶段的时候,其真实类型都是ArrayList了,相当于泛型被擦除了
三,java注解
jdk引入的一种注释机制,用来标注的
如JUnit的测试方法需要用@test来标注表示这是测试方法
public @interface 注解名称{
public 属性类型 属性名() default 默认值;
}
元注解
就是注解注解的注解
@Target 约束自定义注解只能在那些地方使用
@Retention 申明注解的生命周期
在你的注解上面加
@Target({ElementType.METHOD}) 只能注解方法
public @interface Test{
}
四,动态代理
被代理者没有能力或不愿意去做,需要找动态对业务功能进行代理
- 必须有接口,实现类要实现接口
-
创建一个实现类的对象,该对象为业务对象,紧接着为业务对象做一个对象代理