【Java学习】反射

Junit单元测试:
测试分类:
1.黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。
2.白盒测试:需要写代码的。关注程序具体的执行流程。
Junit使用:白盒测试
步骤:
1.定义-个测试类(测试用例)
建议:
测试类名:被测试的类名Test
CalculatorTest
包名: xxx. xxx. xx.test
cn. itcast. test
2.定义测试方法:可以独立运行
建议:
方法名: test测试的方法名
testAdd()
返回值: void
参数列表:空参
3.给方法加@Test
4.导入junit依赖环境*

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

public class CalculatorTest {

    // 所有测试代码执行之前都会先执行该方法
    @Before
    public void init() {
        System.out.println("init..");
    }

    // 所有测试代码执行之后都会执行该方法
    @After
    public void close() {
        System.out.println("close...");
    }


    @Test
    public void add() {
        //System.out.println("执行成功");
        Calculator c = new Calculator();
        int result = c.add(1, 2);
        System.out.println(result);
        // 断言,将期望值与结果比较
        // 红色:失败
        // 绿色:成功
        Assert.assertEquals(3,result);
    }
}
public class Calculator {
    public int add(int a,int b){
        return a - b;
    }
}

反射:程序设计的灵魂
框架:半成品软件,可以在框架的基础上进行软件开发,简化编码
反射:将类的各个组成部分封装为其他对象,这就是反射机制
好处:1.可以在程序运行过程中,操作这些对象
2.可以解耦,提高程序的可扩展性

获取Class对象的方式:
1.Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象
多用于配置文件,将类名定义在配置文件中。读取文件,加载类
2.类名.Class:通过类名的属性class获取
多用于参数的传递
3.对象.getClass():getClass()方法在Object类中定义的
多用于对象获取字节码的方式
结论:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个

Class对象功能:
*获取功能:
1.获取成员变中们

  • Field[] getFields()
  • Field getField(string name)
  • Field[] lgetDeclaredFields()
  • Field getDeclaredField(string
    name )
    2.获取构造方法们
    Constructor[] getConstructors()
  • Constructor getConstructor(类… parameterTypes)
  • Constructor getDeclaredConstructor(类… parameterTypes )
    Constructor[] getDeclaredConstructors()
    3.获取成员方法们:
    Method[] getMethods()
  • Method getMethod(String name, 类… parameterTypes)
  • Method[] getDeclaredMethods()
  • Method getDeclaredMethod(String name,类… parameterTypes)
    4.获取类名

Method :方法对象
*执行方法:

  • object invoke(object obj, object… args)
    *获取方法名称:
  • string getName:获取方法名
    案例:
    *需求:写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法
    *实现:
    1.配置文件
    2.反射、
    步骤:
    1.将需要创建的对象的全类名和需要执行的方法定义在配置文件中
    2.在程序中加载读取配置文件
    3.使用反射技术来加载类文件进内存
    4.创建对象
    5.执行方法|
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

public class ReflectTest {
    public static void main(String[] args) throws Exception {
        Properties pro = new Properties();
        ClassLoader classLoader = ReflectTest.class.getClassLoader();
        InputStream is = classLoader.getResourceAsStream("pro.properties");
        pro.load(is);

        String className = pro.getProperty("calssName");
        String methodName = pro.getProperty("methodName");

        
        Class cls = Class.forName(className);
        Object obj = cls.newInstance();
        Method method = cls.getMethod(methodName);
        method.invoke(obj);
    }
}

你可能感兴趣的:(java,反射)