好,今天讲解一下java反射的第二部分。为了让类对象的读取更加灵活,我们再在reflect包下创建一个配置文件。(我将其命名为refconfig.properties键值对形式)。
在配置文件中写入多个变量分别对应类名和几个方法名:
sub.className = com.reflect.sub
sub.methodName1 = getName
sub.methodName2 = setName
还记得我们在上一篇中创建的方法类sub吗?我们先在配置文件中引入三个变量来对应sub类中的类名以及一个无参方法和一个有参方法,待会看看行不行。
首先读取配置文件,读取配置文件时需要创建一个配置文件对象,拿到类加载器并将其加载进配置文件对象中:
//创建配置文件的对象
Properties properties = new Properties();
//拿到类加载器
InputStream inp = ref.class.getClassLoader().getResourceAsStream("com/reflect/refconfig.properties");
//加载进properties对象中
properties.load(inp);
需要注意的是,引号中填写的是配置文件所在路径。在使用InputStream前,需要import java.io.InputStream; 导入包。而且实际上“ref.class”这个部可以替换为当前项目中任意一个已经存在的类,因为我的目的是通过类加载器来获取资源,只要这个类的类加载器能访问到目标资源即可。
有了配置文件对象,可以通过getProperty来获取配置文件中变量的值:
String claName = properties.getProperty("sub.className");
String metNameGetName = properties.getProperty("sub.methodName1");
String metNameSetName = properties.getProperty("sub.methodName2");
这个时候我们就可以创建类对象了:
Class cla = Class.forName(claName);
我们来测试一下,还记得我在sub类中放了一个传参构造方法,我们new一个sub类对象:
sub s = new sub("小明",18);
我们先来试试获取sub类中属性:
Field[] fie = cla.getDeclaredFields();
for(Field i:fie) {
System.out.println(i.getName());
}
可以发现确实打印出了sub类中name、age和from三个属性。我们再试试执行无参构造方法,还记得使用invoke来执行方法吗?
Method met1 = cla.getDeclaredMethod(metNameGetName);
System.out.println(met1.invoke(s));
发现程序做到了sub中getName方法,并返回打印了“小明”。好,我们再试试传参方法:
Method met1 = cla.getDeclaredMethod(metNameGetName);
Method met2 = cla.getDeclaredMethod(metNameSetName,String.class);
met2.invoke(s,"张三");
System.out.println(met1.invoke(s));
也打印出了修改后的“张三”。补充一个点,使用getDeclaredMethod方法获取有参方法时,一定要在第二个空填写好参数类型,否则默认找的是无参数方法。
好,就讲到这里,希望对大家有用。