一、前驱知识点
1.Properties集合
Map->Hashtable->Properties,Properties集合主要用来存储字符串类型的键和值。
Properties pro = new Properties();
pro.setProperty("张三","23");//设置键和值
String name1 = pro.getProperty("张三");//获取对应键的值,即:张三的值
System.out.println(name1);
2.Properties的load方法
load方法可以加载字节流,将字节流对应的数据转换进Properties集合。
需要注意的是,在命名配置文件时,要加后缀Properties(前提是用Properties集合读配置文件)
3. 配置文件
创建配置文件时,要选资源包
4.调试方法
在30行上下设置两个输出语句, 可以判断问题出在30行,可以不通过设置断点调试。
二、案例代码
案例要求:
package cn.itcast.reflect;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
public class ReflectTest {
public static void main(String[] args) throws Exception {
//创建Properties双列集合,用于存放键值数据
Properties pro = new Properties();
//Reflect的类加载器
ClassLoader classLoader = ReflectTest.class.getClassLoader();
//用类加载器的方法找到名字为pro的配置文件,转换成字节流
InputStream is = classLoader.getResourceAsStream("po.properties");
/*
* 另一个方法是 classLoader.getResource() 参数为配置文件的路径
* */
//用Properties的load方法加载该字节流,将数据存入Properties集合
pro.load(is);//抛出异常
//接下来,用获取类名和方法名
String className1 = pro.getProperty("className");
String methodName1 = pro.getProperty("methodName");
//加载类,类型通配符<?>用于接收forName()的结果,即:类
Class className2 = Class.forName(className1);
//创建className2的实例对象
Object o = className2.newInstance();
//获取方法对象
/* 错误
* Method methodName2 = className2.getMethod("methodName1");
* */
Method methodName2 = className2.getMethod(methodName1);
methodName2.invoke(o);
is.close();
}
}
这里需要注意的是,getMethod方法的参数是字符串,而我们需要获得的是eat方法,即:参数为字符串eat,所以此时参数可以有两种形式:
1.“eat” 2.methodName1 //methodName1就是键methodName对应的值eat
错误示范:“methodName1”(Person类中没有该方法,只有eat方法,所以会有NoSuchMethodException)
(1)调用Person类的eat方法
className=cn.itcast.domain.Person
methodName=eat
配置文件中的内容,注意:方法名和类名的值不需要加引号
输出:eat...
(2)调用Student类的sleep方法
className=cn.itcast.domain.Student
methodName=sleep
输出:sleep...