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

2023-10-13  本文已影响0人  扶光_

一,单元测试

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

Junit单元测试框架(开源)

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

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


    测试
    结果

二,反射

对于任何一个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{
    
    }
image.png

四,动态代理

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

上一篇 下一篇

猜你喜欢

热点阅读