Junit_测试

单元测试断言

@Test 无需psvm main函数

@Before 一般用于资源申请

@After 一般用于资源释放

package com.demojunit;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class CalcTest {
    /*
    初始化方法
    */
    @Before
    public void init(){
        System.out.println("initing");
    }
    /*
    结束方法
    */
    @After
    public void close(){
        System.out.println("closeing");
    }
    @Test
    public void testAdd(){
        System.out.println("run");
        Calc c =new Calc();
        System.out.println(c.add(1,2));//单元测试不会输出
        //单元测试使用断言方法,判断是否与期望是否相同
        Assert.assertEquals(3,c.add(2,2));
        /*
        java.lang.AssertionError:
        预期:3
        实际:4
        预期不同即会报错
        */
    }
}

反射:框架的灵魂

框架:程序脚手架

反射:将类的各个组成部分封装为其他对象

  • 获取Class对象的方式-三阶段
    • Class.forName(“类名”) — 将字节码文件加载进内存,返回class对象
      • 多用于配置文件,将类名定义在配置文件中。读取加载类。
    • 类名.class — 通过类名的属性class获取
    • 对象.getClass() — Object类的getClass方法
package com.demoreflect;

import com.person.person;

public class reflectDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        //获取Class对象的方式1
        Class cls = Class.forName("com.person.person"); //精确到java文件
        System.out.println(cls);

        //获取Class的方式2
        Class cls2 = person.class;
        System.out.println(cls2);

        //获取Class的方式3
        person p =new person();
        Class cls3 = p.getClass();
        System.out.println(cls3);
    }
}

Class对象常用功能:

获取成员变量

Declared 获得私有变量

setAccessible 忽略访问权限修饰符的安全检测,暴力反射

package com.demoreflect;

import com.person.person;

import java.lang.reflect.Field;

public class reflectDemo2 {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Class personClass = person.class;
        //    获取成员变量
        Field[] fields = personClass.getDeclaredFields(); //获取Declared私有的变量,在反射中可以修改所有公有私有变量
        for(Field field:fields){
            System.out.println(field);
        }
        //获取公有变量
        Field field = personClass.getField("bj"); //不用Declared不能获取私有变量
        System.out.println(field);
        person p1 =new person();
        field.set(p1,"class1");  //利用person.bj的Class方法给p1的bj复制
        System.out.println(p1);
				//获取Declared私有的变量
        Field field1 = personClass.getDeclaredField("name"); //用Declared获取私有变量
        field1.setAccessible(true); //修改private安全性,暴力反射
        field1.set(p1,"zhangsan"); //获取private修饰的变量
        Object value = field1.get(p1);
        System.out.println(value);
        System.out.println(p1);
    }
}

获取构造方法

public class reflectDemo2 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Class personClass = person.class;
        //    获取构造方法
        Constructor constructor = personClass.getConstructor(String.class,int.class);
        System.out.println(constructor);
        Object p1  = constructor.newInstance("test",23);
        System.out.println((person)p1);  //向下转型

        Object p2  = personClass.newInstance(); //空参构造方法简写
        System.out.println((person)p2);  //向下转型
    }
}

获取成员方法

setAccessible 忽略访问权限修饰符的安全检测,暴力反射

获取类名

package com.demoreflect;

import com.person.person;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class reflectDemo2 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Class personClass = person.class;
        //    获取所有成员方法
        Method[] methods = personClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

        //获取方法
        Method eatMethod = personClass.getMethod("eat");
        person p1 = new person();
        eatMethod.invoke(p1); //执行空参方法
        Method eatMethod2 = personClass.getMethod("eat",java.lang.String.class);
        eatMethod2.invoke(p1,"food"); //执行带参方法

        //获取方法名
        System.out.println(eatMethod2.getName());
        //    获取类名
        System.out.println(personClass.getName());
    }
}

反射案例

自定义框架:创建任意类,并执行其中任意方法

package com.demoreflect;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

public class reflectproject {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        //创建任意类对象,执行任意方法

        //1创建对象
        Properties prop = new Properties();
        InputStream is = reflectproject.class.getClassLoader().getResourceAsStream("pro.properties");
        prop.load(is);

        //2.获取配置内容
        String className = prop.getProperty("className");
        String methodName = prop.getProperty("methodName");

        //加载该类进内存
        Class cls = Class.forName(className);
				//利用类创建对象
        Object clsobj = cls.newInstance();
				//创建配置方法
        Method method = cls.getMethod(methodName);
				//执行方法传入对象参数
        method.invoke(clsobj);
    }
}
comments powered by Disqus