1.Juit

Junit单元测试

Junit使用:

步骤:

	*1.定义一个测试类(建议Test)

	*2.包名:xxx.xxx.Test

	*3.测试方法:可以独立运行

	*方法名:建议test,参数直接为空,给某个方法加个@Test

	*@Before 在方法前面加上,会在所有方法执行前执行,相当于构造函数

	*@After 在方法前面加上,会在所有方法执行后执行,相当于析构函数

	*4.导入Junit的依赖环境

	*5.断言:

	*Java中的Assert类提供了公共接口

反射:框架设计的灵魂

*框架是半成品,可以在框架的基础上进行软件开发,简化编码

*反射:将类的各个组成部分封装成为其他对象,这就是反射机制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QDiWQQUf-1618327607870)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210316204711848.png)]

*好处:

​ *1.可以在程序运行中,操纵这些对象

​ *2.可以解耦,可以提高程序的可扩展性

*获取class类的方法:

​ 1.Class.forName(“全类名”):将自己尔玛文件加载之内存中,返回class对象

​ 2.类名.class:通过类名的属性class获取

​ 3.对象.getClass():getClass方法在Object类中,所有对象都可以访问

​ 同一个字节码文件在一个程序运行中,class字节码文件只被加载一次,可以用==比较类的地址值

class对象的功能:

*获取字节码的功能:

​ 1.获取成员变量名 Field[] getFields()

​ Field getField(String name)

​ Field[] getDeclaredFields()

​ Field getDeclaredField(String name)

​ 2.获取构造方法名,

	Constructor<?>[]	getConstructors()

	Constructor<T>	getDeclaredConstructor(Class<?>... parameterTypes)

	Constructor<?>[]	getConstructors()

	Constructor<T>	getDeclaredConstructor(Class<?>... parameterTypes)

​ 3.获取成员方法名

	Method[]	getMethods()

	Method	getMethod(String name, Class<?>... parameterTypes)

	Constructor<?>[]	getDeclaredConstructors()

	Constructor<T>	getDeclaredConstructor(Class<?>... parameterTypes)

​ 4.获取类名

String getName()

Field对象成员变量

1.设置值, set()

2.获取值,get()

3.忽略访问权限,setAccessible(true)暴力反射

注意:不能獲取private屬性的,主要是獲取變量,然後设置值,

Constructor构造方法:

可以使用newInstance()方法

也可以使用Class的newInstance方法

Method对象功能:

执行方法,对象.invoke()

案例:

*需求:写一个“框架”,不改变任意代码,可以帮我们创建任意对象,执行任意方法

Caculator.java

package Junit;

/**
 * 计算器
 */
public class Caculator {
    public int a;
    public String s;
    private int b;
    public Caculator(int a,int b)
    {
        this.a=a;this.b=b;
    }
    public Caculator(String s,int t)
    {
        this.s=s;a=t;
    }
    public  Caculator()
    {

    }
    public int add(int a,int b)
    {
        return a+b;
    }
    public int jian(int a, int b)
    {
        return a-b;
    }
    @Override
    public String toString()
    {
        return s+a;
    }
}

CaculatorText.java

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class CaculatorText {

    /**
     * 初始化方法:
     * 在方法前面加上 @Before
     * 该方法用于申请资源,会在所有方法执行前执行
     */
    @Before
    public void CaculatorTest()
    {
        System.out.println("init");
    }

    /**
     * 在方法前面加上 @After
     * 析构函数,释放内存,该方法会在所有方法运行完后释放
     */
    @After
    public void close()
    {
        System.out.println("free");
    }
    /**
     * 用Junit测试代码
     */
    @Test
    public void test()
    {
        Caculator c = new Caculator();
        int res = c.add(1,2);
        //断言:我断言这个数字是3
        Assert.assertEquals(3,res);
        System.out.println(res);
        res = c.jian(1,2);
        System.out.println(res);
    }
}

reflect.java

package Junit;

public class reflect {
    /**
     * 获取class类的方法:
     *
     * ​	1.Class.forName("全类名"):将自己尔玛文件加载之内存中,返回class对象
     *
     * ​	2.类名.class:通过类名的属性class获取
     *
     * ​	3.对象.getClass():getClass方法在Object类中,所有对象都可以访问
     */
    public static void main(String[] args) {
        //1.Class.forName("全类名")
        try {

            Class cls1 = Class.forName("Junit.Caculator");
            System.out.println(cls1);
        }
        catch (Exception e)
        {
            System.out.println("Error");
        }
        //2.类名.class
        Class cls2 = Caculator.class;
        System.out.println(cls2);
        //3.对象.getClass()
        Caculator c = new Caculator();
        Class cls3 = c.getClass();
        System.out.println(cls3);
    }
}

ReflectDemo2.java

package Junit;

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

public class ReflectDmo2 {
    /*
    获取字节码的功能:
        注意不能獲取private方法
​	1.获取成员变量名	Field[]	getFields()

​									Field	getField(String name)

​									Field[]	getDeclaredFields()

​									Field	getDeclaredField(String name)

​	2.获取构造方法名,

        Constructor<?>[]	getConstructors()

        Constructor<T>	getDeclaredConstructor(Class<?>... parameterTypes)

        Constructor<?>[]	getConstructors()

        Constructor<T>	getDeclaredConstructor(Class<?>... parameterTypes)

​	3.获取成员方法名

        Method[]	getMethods()

        Method	getMethod(String name, Class<?>... parameterTypes)

        Constructor<?>[]	getDeclaredConstructors()

        Constructor<T>	getDeclaredConstructor(Class<?>... parameterTypes)

​	4.获取类名

        String getName()
     */
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //1
        Class cls = Caculator.class;
        Field[] fields= cls.getFields();
        for(Field field : fields)
        {
            System.out.println(field);
        }
        try {
            Field field = cls.getField("a");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        Caculator c =new Caculator();
        Field a= null;
        try {
            a = cls.getField("a");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        try {
            Object value = a.get(c);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        try {
            a.set(c,111);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        a.setAccessible(true);//暴力反射
        System.out.println(c);


        //2
        Constructor constructor = cls.getConstructor(String.class, int.class);
        Object person = constructor.newInstance("周迎川",21);
        System.out.println(person);
        //3
        Method add_method = cls.getMethod("add");
        Caculator cc =new Caculator(4,5);
        add_method.invoke(c);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值