创建一个学生类跟老师类还需要一个配置文件这里使用的是properties文件
public class Student {
private String name;
private Integer age;
private Student() {
System.out.println("学生无参");
}
public void studay(){
System.out.println("学生类...");
}
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 class Teacher {
private String name;
private Integer age;
private Teacher() {
System.out.println("老师无参");
}
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 studay(
){
System.out.println("老师类...");
}
}
工具类:
public class ProUtils {
private static Properties pro = new Properties();
private static InputStream is;
//准备一个静态代码块, 其目的就是为了保证这里面的代码只会被执行一次
static {
try {
//获取系统类加载器
ClassLoader loader = ClassLoader.getSystemClassLoader();
//获得配置文件的真是路径
URL resource = loader.getResource("ben.properties");
String path = resource.getPath();
//创建io流
is = new FileInputStream(path);
pro.load(is);
} catch (IOException e) {
e.printStackTrace();
}finally {
if (is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static Properties getProperties(){
return pro;
}
}
测试类:
public static void main(String[] args) throws Exception {
Properties pro = ProUtils.getProperties();
String className = pro.getProperty("className");
//反射
Class<?> clazz = Class.forName(className);
//获得构造
Constructor<?> con = clazz.getDeclaredConstructor();
//去除权限
con.setAccessible(true);
//创建对象
Object obj = con.newInstance();
//使用键获取值。获取成员方法
String methodName = pro.getProperty("methodName");
Method method = clazz.getDeclaredMethod(methodName);
method.setAccessible(true);
//调用成员方法。如果需要打印返回值可以在前面加一个返回值:Object
method.invoke(obj);
//使用键获取值。获取成员变量
String fieldName = pro.getProperty("fieldName");
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
//使用键获取值。给成员变量赋值
String fieldValue = pro.getProperty("fieldValue");
//赋值之前先给变量判断一下
String s = field.getType().toString();
if (s.contains("Integer")){
int i = Integer.parseInt(fieldValue);
field.set(obj,i);
}else {
field.set(obj,fieldValue);
}
Object o = field.get(obj);
System.out.println(o);
}
配置文件:
className=com.itheima.myreflect4.Student
methodName=studay
fieldName=name
fieldValue=zhangsan