测试类
package test;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;
public class test01 {
public static void main(String[] args) throws Exception {
// 调用工具类,返回的值是一个map集合
Properties properties = ProUtils.getProperties();
// 使用properties.getProperty("className");方法
// 通过键获取value
// 这个value对应的就是某个类的全类名
String className = properties.getProperty("className");
// 通过类的全类名获取Class对象
Class<?> aClass = Class.forName(className);
// 通过Class对象,调用方法,获取里面的空参构造方法
Constructor<?> constructor = aClass.getDeclaredConstructor();
// 去除权限
constructor.setAccessible(true);
// 创造这个类的对象
Object object = constructor.newInstance();
// 使用properties.getProperty("methodName");方法
// 通过键获取值
// 这个值只是个String类型的值,这个值和类里面的方法名一直
// 主要是为了接下来通过放射去找到类里面的这个方法
String methodName = properties.getProperty("methodName");
// 通过反射获取获取到这个方法对应的Method
Method method = aClass.getDeclaredMethod(methodName);//
// 去除权限 //这三步加起来就相当于new了一个类的对象
method.setAccessible(true); //Student stu = new Student();
// 执行方法 //
method.invoke(object); //
// 使用properties.getProperty("name");方法
// 通过键获取value
// 这个值也是一个String类型的值,这个值和类中成员变量的name一直
// 主要是通过反射在类中找到这个值对应的成员变量
String fieldname = properties.getProperty("fieldName");
// 通过反射获取对应的成员变量
// 只有获取了我们才能对其进行操作
Field FieldName = aClass.getDeclaredField(fieldname);
// 去除权限
FieldName.setAccessible(true);
// 这个是获取配置文件中fieldValue的值
// 通过键获取值
// 这个值主要是赋给类中成员变量的
String fieldValue = properties.getProperty("fieldValue");
/*
通过反射获取成员变量对应的数据类型,并且转成字符串类型
String fieldType = FieldName.getType().toString();
判断类型
因为配置文件中的数据都是字符串类型的
所以如果是获取的成员变量是Integer类型
那么就需用将字符串类型转成Integer类型
if(fieldType.contains("Integer")){
int fValue = Integer.parseInt(fieldValue);
FieldName.set(object,fValue);
}else{
FieldName.set(object,fieldValue);
}
*/
// 给成员变量赋值
// 两个参数:第一个参数是这个类的对象,第二个值是给这个成员变量赋的值
FieldName.set(object,fieldValue);
// 通过反射获取成员变量的值
Object fValue = FieldName.get(object);
System.out.println(fieldname+"该成员变量的值是"+fValue);
}
}
工具类
package test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/*
这是工具类,主要是用来操作配置文件中的数据的是
*/
public class ProUtils {
/*
静态代码块只能调用被静态修饰的成员变量
*/
// 创建一个Properties
private static Properties prop = new Properties();
/*
在一个工具类中,静态(static)代码块只会被执行一次
当程序启动一次以后,如果类中某些方法只要执行一次的话,就放到静态代码块中
如果不放到静态代码块中,那么只要有一个主方法调用这个工具类,那么这个方法就会执行一次
*/
static {
try {
// 获取一个类加载器
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
// 通过getResourceAsStream直接获取配置文件中的数据,返回值是一个字节流
InputStream is = classLoader.getResourceAsStream("bean.properties");
// 使用load的方法将字节流中的数据一次性加载到集合中
prop.load(is);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/*
只要被静态修饰的方法,在主方法中才能用(类名.方法名)的方式调用
*/
// 返回值是Properties类型的
public static Properties getProperties(){
// 需要将操作出来的集合作为参数返回给调用者
return prop;
}
}
配置文件
className=test.Student
methodName=study
fieldName=name
fieldValue=laoluo
老师类和学生类
package test;
public class Student {
private String name;
private Integer age;
public Student() {
}
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public void study(){
System.out.println("学生学习");
}
}
package test;
public class Teacher {
private String name;
private Integer age;
public Teacher() {
}
public Teacher(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public void study(){
System.out.println("老师学习");
}
}
|