
在以前,如果我们想要调用一个类中的方法,只能这样子:
例:
有Cat和Dog两个类,里面有eat和run两个成员方法:
public class Dog { public void eat() {
System.out.println("狗吃肉");
} public void run() {
System.out.println("狗刨");
}
}
public class Cat { public void eat() {
System.out.println("猫吃鱼");
} public void run() {
System.out.println("猫爬树");
}
}
在之前,如果想要调用类里面的方法,只能这样:
这样做,有个缺点,如果类多了,方法多了,以后的更改很麻烦。
//之前的做法
Cat c = new Cat();
c.eat();
c.run(); Dog d = new Dog();
d.eat();
d.run();
那么,为了以后的更改的方便。
创建个对应的配置文件,运用反射来访问这些方法:
配置文件:(Properties
类表示了一个持久的属性集。里面的内容就是键值对 “aaaa=bbb ”)
例:
ClassName=zl_Reclfect_05.Cat
MethodName=eat
创建个反射的类来通过配置文件调用类中的方法:
之后要想调用哪个类的哪个方法,只需要去配置文件更改相对应的键值就可以了。
//反射的做法 //Properties类:
//C、public String getProperty(String key):根据键获取值 //加载键值对数据 //首先创建个属性集类
Properties p = new Properties();
//封装配置文件
FileReader file = new FileReader("class.txt");
//获取键的集合
//void load(InputStream inStream) 从输入流中读取属性列表(键和元素对)。
p.load(file);
file.close(); //获取键的值(做配置文件,肯定知道键的)
String classname = p.getProperty("ClassName");
String methodname = p.getProperty("MethodName"); //用反射来调用成员方法 //获取字节文件对象
Class c = Class.forName(classname); //无参构造创建对象
Constructor con = c.getConstructor();
Object obj = con.newInstance(); //调用方法
Method m = c.getMethod(methodname);
m.invoke(obj); //之后要想调用哪个类的哪个方法,只需要去配置文件更改相对应的键值就可以了。