当前位置: 首页>后端>正文

JavaSE进阶 单元测试 反射 注解 动态代理

一,单元测试

单元测试就是针对最小功能单元编写测试代码,java程序最小的功能单元是方法。

Junit单元测试框架(开源)

很普遍的一种测试框架,所以IDE工具都集成了Junit。

  • 优点
    可以灵活选择执行那些测试方法,可以一键执行全部测试方法
    可以生产全部方法测试报告,如哪些成功哪些失败
    如果某个方法测试失败了,不会影响其他方法的测试

  • 快速使用

  1. 将Junit的jar包导入到项目中,一般ide中都自动会包含
    2.编写测试方法,方法必须是公共的无参的无返回值的非静态方法
    3.在测试方法上加@test注解,表示是一个测试方法
    4.在测试方法中完成被测试方法的预期正确性测试
    5.选中测试方法 Junit运行 ,绿色表示成功,红色表示失败


    JavaSE进阶 单元测试 反射 注解 动态代理,第1张
    测试

    JavaSE进阶 单元测试 反射 注解 动态代理,第2张
    结果
  • 单元测试中的常用注解
    1 @Test测试方法
    2 @Before 修饰实例方法,每一个测试方法之前执行一次
    3 @After 修饰实例方法,每一个测试方法之后执行一次
    4 @/BeforeClass用来静态修饰方法,所有测试方法之前只执行一次
    5 @AfterClass 用来静态修饰方法,所有测试方法之后只执行一次
    开始执行的方法,初始化资源
    执行完之后方法,释放资源

二,反射

对于任何一个class类,在运行的时候都可以直接得到这个类的全部成分


JavaSE进阶 单元测试 反射 注解 动态代理,第3张
类也是一个类对象

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{
    
    }
JavaSE进阶 单元测试 反射 注解 动态代理,第4张

四,动态代理

被代理者没有能力或不愿意去做,需要找动态对业务功能进行代理

  • 必须有接口,实现类要实现接口
  • 创建一个实现类的对象,该对象为业务对象,紧接着为业务对象做一个对象代理


    JavaSE进阶 单元测试 反射 注解 动态代理,第5张

https://www.xamrdz.com/backend/3dr1940580.html

相关文章: