反射_运行配置文件指定内容
练习:通过配置文件运行类中的方法
反射_运行配置文件指定内容的练习
xxxxxxxxxx
package ch27;
public class a_13_1Student {
public void study(){
System.out.println("我是学生类");
}
}
xxxxxxxxxx
package ch27;
public class a_13_2Teacher {
public void teach(){
System.out.println("我是老师类");
}
}
xxxxxxxxxx
package ch27;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;
public class a_13_3测试 {
public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//创建学生类的对象
a_13_1Student s = new a_13_1Student();
//调用学生类里面的study方法
s.study();
//创建老师类的对象
a_13_2Teacher t = new a_13_2Teacher();
//调用老师类里面的teach方法
t.teach();
System.out.println("-----------下面的是反射的相关代码操作---------------");
//-----------------------------------------------------------------------------------------------------------------
/*场景及思考:如果我们需要使上面两部分的代码我们有时候只想要其中一种,例如当我们只要创建学生类对象调用学生类里面的方法,则我们就不得不
把老师类那部分的代码注释掉;当我们只需要老师类那部分的代码时,又不得不注释掉学生类那部分的代码,就非常繁琐。能不能使用反射实现把
指定的类和类中的方法的事情放到指定的配置文件中,这样我们就不用每次来改main方法中的代码了
分析:让class.txt文件去配置我们要使用的类,及配置类中的方法
具体过程:新建一个class.txt文件,写入如下内容
className=ch27.a_13_1Student
methodName=study
我们把上面两行的左边叫做键,是不可变的;上面两行的右边叫做值,是可变的
*/
//如何在测试类里面使用’a_13_4class.txt‘的配置文件的最前面两行,即运行a_13_1Student中的study方法
//首先,我们要加载配置文件里面的数据,要使用我们之前学的IO流的Properties类的load方法,返回值是集合,如下
Properties prop = new Properties();
FileReader fr = new FileReader("java\\src\\ch27\\a_13_4class.txt");
prop.load(fr);
//释放资源
fr.close();
//指定哪个为键
String className = prop.getProperty("className");//这行左边拿到的值其实是35行的右边
String methodName = prop.getProperty("methodName");//这行左边拿到的值其实是36行的右边
//拿到数据后,就可以通过反射来使用
Class<?> c = Class.forName(className);//这行forName方法里面的参数其实就是ch27.a_13_1Student
//获取学生类里面写好的无参构造方法
Constructor<?> con = c.getConstructor();
//使用newInstance方法为无参构造方法来创建对象
Object obj = con.newInstance();
//我们最终运行的是methodName,即学生类里面的study方法。下面的m是学生类里面的study方法的对象
Method m = c.getMethod(methodName);//这行的method就是52行左边的那个,这行getMethod方法里面的参数其实就是36行右边的study方法
m.invoke(obj);//由于学生类里面的study方法是无参无返回值的,所以这行不用接收不用写参数,直接调用
/*因为我们的'a_13_4class.txt'配置文件只写了学生类的键和值,所以上面的反射就会通过运行'a_13_4class.txt'配置文件来调用学生类
里面的方法。如果我们想要输出老师类的方法怎么实现呢,很简单,去'a_13_4class.txt'文件那里的那两行改一下就行,注意左边的是键不能
改,只能改右边的值,那里第一行右边是类名,第二行右边是类对应的方法名。
小提示:'a_13_4class.txt'文件里面是可以使用注释的,所以我已经把注释写出来了,想要这里的测试类输出老师类的方法就把,老师类的那两行
解开注释,同理想要这里的测试类输出学生类的方法就把,学生类的那两行解开注释*/
//总结上面的反射就是:通过反射来运行配置文件里面的内容来运行指定类的指定方法
//优点:当需求变动时,只需要改配置文件里面的内容,不需要改这里测试类里面的内容
}
}