java反射机制和junit的使用

1. 反射的原理

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

  • 应用在一些通用性比较高的代码中

  • 后面学到的框架,大多数都是使用反射来实现的

  • 在框架开发中,都是基于配置文件开发

  • 在配置文件中配置了类,可以通过反射得到类中的所有内容,可以让类中的某个方法来执行

  • 类中的所有内容:属性、没有参数的构造方法、有参数的构造方法、普通方法

画图分析反射的原理

img

  1. 首先需要把java文件保存到本地硬盘 .java

  2. 编译java文件,成.class文件

  3. 使用jvm,把class文件通过类加载加载到内存中

  4. 万事万物都是对象,class文件在内存中使用Class类表示

当使用反射时候,首先需要获取到Class类,得到了这个类之后,就可以得到class文件里面的所有内容,包含属性、构造方法和普通方法。

2. 使用反射操作类里面的无参构造方法

public class Student {
    private String name;
    private int age;
​
    public Student() {
        super();
    }
​
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    public void show() {
        System.out.println("show");
    }
​
    public void method(int x, int y) {
        System.out.println(x + "method" + y);
    }
}

测试类:

    @Test
    public void test1() throws Exception {
        // 得到Class
        Class clazz = Class.forName("com.yfy.Student");
        // 获取无参构造方法
        Student s = (Student) clazz.newInstance();
        s.setName("张三");
        s.setAge(20);
        System.out.println(s.getName() + "--" + s.getAge());
    }

3. 使用反射操作有参数的构造方法

    @Test
    public void test2() throws Exception {
        // 得到Class
        Class clazz = Class.forName("com.yfy.Student");
        // 使用有参数的构造方法
        // c1.getConstructors();//获取所有的构造方法
        // 传递是有参数的构造方法里面参数类型,类型使用class形式传递
        Constructor con = clazz.getConstructor(String.class, int.class);
        // 通过有参数的构造方法创建Student实例
        Student s = (Student) con.newInstance("李四", 18);
        System.out.println(s.getName() + "--" + s.getAge());
    }

4. 使用反射操作属性

    @Test
    public void test3() throws Exception {
        // 得到Class
        Class clazz = Class.forName("com.yfy.Student");
        // 获取Student类中的字段,包括私有
        Field field = clazz.getDeclaredField("name");
        // 对私有字段的访问取消权限检查。暴力访问。
        field.setAccessible(true);
        Student s = (Student) clazz.newInstance();
        // 给s对象的name属性赋值
        field.set(s, "王五");
        //得到该字段在s对象中的属性值
        System.out.println(field.get(s));
    }

5. 使用反射操作普通方法

    @Test
    public void test4() throws Exception {
        // 得到Class
        Class clazz = Class.forName("com.yfy.Student");
        // 获取带参数的构造方法
        Constructor con = clazz.getConstructor(String.class, int.class);
        Student s = (Student) con.newInstance("李四", 18);
        //获取类中的带参方法
        Method method=clazz.getMethod("method", int.class,int.class);
        //调用带参方法
        method.invoke(s, 3,7);
        //获取类中的无参方法
        Method method1=clazz.getMethod("show");
        //调用无参方法
        method1.invoke(s);
    }
  • getDeclaredMethod(方法名称,方法里面参数的类型):得到任意一个方法,包括私有

  • getDeclaredMethods():得到所有方法,包括私有。

  • setAccessible(true):对私有方法取消权限检查。

6. junit的使用

JUnit 是一个 Java 编程语言的单元测试框架。JUnit 在测试驱动的开发方面有很重要的发展,是起源于 JUnit 的一个统称为 xUnit 的单元测试框架之一。

junit注解

  1. @Test:这个注释说明依附在 JUnit 的 public void 方法可以作为一个测试案例。

  2. @Before:有些测试在运行前需要创造几个相似的对象。在 public void 方法加该注释是因为该方法需要在 test 方法前运行。

  3. @After:如果你将外部资源在 Before 方法中分配,那么你需要在测试运行后释放他们。在 public void 方法加该注释是因为该方法需要在 test 方法后运行。

  4. @BeforeClass:在 public void 方法加该注释是因为该方法需要在类中所有方法前运行。

  5. @AfterClass:它将会使方法在所有测试结束后执行。这个可以用来进行清理活动。

  6. @Ignore:这个注释是用来忽略有关不需要执行的测试的。

执行过程

  • beforeClass(): 方法首先执行,并且只执行一次。

  • afterClass():方法最后执行,并且只执行一次。

  • before():方法针对每一个测试用例执行,但是是在执行测试用例之前。

  • after():方法针对每一个测试用例执行,但是是在执行测试用例之后。

  • 在 before() 方法和 after() 方法之间,执行每一个测试用例。

断言

unit所有的断言都包含在 Assert 类中。

这个类提供了很多有用的断言方法来编写测试用例。只有失败的断言才会被记录。Assert 类中的一些有用的方法列式如下:

方法描述
assertEquals(boolean expected, boolean actual)检查两个变量或者等式是否平衡
assertTrue(boolean expected, boolean actual)检查条件为真
assertFalse(boolean condition)检查条件为假
assertNotNull(Object object)检查对象不为空
assertNull(Object object)检查对象为空
assertSame(boolean condition)检查两个相关对象是否指向同一个对象
assertNotSame(boolean condition)检查两个相关对象是否不指向同一个对象
assertArrayEquals(expectedArray, resultArray)检查两个数组是否相等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值