1. Junit(测试)
1.三个注解
@Before
@Test
@After
2.一个方法
Assert.assertEquals(7,add);
2. 反射
1.什么是反射
将字节码文件加载到内存中
2.反射的好处
在程序的运行过程中操作这些对象
解耦,提高程序的扩展性
3.获取class对象的三种方式
Class.forName(“全类名”)
常用于配置文件加载类
类名.class 通过类名的class的属性获取
常用于传递参数
对象.getClass() : 该方法在Object中定义
常用于对象获取字节码
4.同一个字节码文件在程序中,只会被加载一次
常用的方法
1.获取成员变量
Field[] getFields() : 获取所有的public修饰的成员变量
Field getField(String name) : 获取指定的
///
Field[] getDeclaredFields() : 获取所有的成员变量
Field getDeclaredField(String name) : 获取指定的
获取有访问权限的成员变量时,需要忽略权限修饰
f.setAccessible(true);
///获取完变量后需要对他进行操作需要有一个对象
Class aClass = Class.forName("demo04.Calculator");
Field a = aClass.getField("a");
Calculator calculator = new Calculator();//任何情况下操作都需要传递一个对象,才能对其中的变量、方法、构造方法进行操作
a.set(calculator,"张大爷");
Object o = a.get(calculator);
2.获取构造器,想要获取构造方法就必须获取构造器
Constructor<?>[] getConstructors() : 获取所有的构造器
Constructor< T >[] getConstructor(类<?>… paramenterTypes) :获取指定参数的构造器
Constructor< T > getDeclaredConstructor(类<?>… paramenterTypes)
Constructor<?>[] getDeclaredConstructors() :所有包括私有的
通过构造器获取构造方法
Constructor constructor = aClass.getConstructor(String.class, int.class);
Object o = constructor.newInstance(“String参数”,int参数) 无参数为空参构造方法
获取空参构造方法的简单方式
Class类中的newInstance()方法
aClass.newInstance();
使用getDeclaredConstructor时也要忽略权限检测
constructor .setAccessible(true);
Class aClass = Class.forName("demo04.Calculator");
Constructor constructor = aClass.getConstructor(String.class, int.class);
Object cons = constructor.newInstance("你好", 19);
3.获取普通方法
Method[] getMethods() 获取所有
Method getMethod(String name,类<?>…) 获取指定名称,参数的方法
Method[] getDeclaredMethods()
Method[] getDeclaredMethod(String name,类<?>…)
method.getName() 获取方法名
Class<Calculator> aClass = Calculator.class;
Method method = aClass.getMethod("getName");//获取有参方法,需要加上参数列表
method.invoke(new Calculator());
/*
Method method = aClass.getMethod("getName",String.class);
method.invoke(new Calculator(),"你好");
*/
4.案例
从配置文件中读取类信息和方法信息,调用该类的方法
//1.加载配置文件
Properties pro = new Properties();//使用Properties集合获取配置文件信息
ClassLoader classLoader = demo05.class.getClassLoader();//找到本类.class文件夹
InputStream is = classLoader.getResourceAsStream("pro.properties");//找到.class下面的配置文件,并读取为流
pro.load(is);//将流写入到集合中
String className = pro.getProperty("className");//在集合中找到指定元素
String method = pro.getProperty("methods");
//2.有了类与方法
Class aClass = Class.forName(className);//加载类文件
Object o = aClass.newInstance();//调用空参构造方法去创建对象
Method method1 = aClass.getMethod(method);//获取需要被执行的方法
method1.invoke(o);//调用方法