实例一
通过配置文件获取文件名字和方法名字,并且借助配置文件的信息,用反射来调用对应的类的变量和方法
configure.txt 配置文件的内容
className = test.reflexDemo.PropertyDemo.Student
methodName = function
学生类
package test.reflexDemo.PropertyDemo;
public class Student {
private String name;
private int age;
public void function(){
System.out.println("学生要学习");
}
public void show(){
System.out.println("学生要考试");
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
老师类
package test.reflexDemo.PropertyDemo;
public class Teacher {
private String name;
private int age;
public void function(){
System.out.println("老师要教书");
}
public void show(){
System.out.println("老师要批阅试卷");
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
实际调用
package test.reflexDemo.PropertyDemo;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Properties;
public class demo {
public static void main(String[] args) throws Exception {
//Properties类用于读取Java的配置文件
//Java的配置文件通常为.properties文件,格式为文本文件,
// 文件的内容的格式是“键=值”的形式,文本注释信息可以用"#"来注释。
Properties p = new Properties();
//利用输入流读取配置文件里面的内容
FileReader fileReader = new FileReader("F:\\idea2018.1\\workplace\\Demo\\src\\test\\reflexDemo\\PropertyDemo\\configure.txt");
p.load(fileReader);
//关闭流
fileReader.close();
//获取数据
String cName = p.getProperty("className");
System.out.println(cName);
String mName = p.getProperty("methodName");
System.out.println(mName);
//通过反射获得Class对象
Class<?> aClass = Class.forName(cName);
Constructor<?> constructor = aClass.getConstructor();
Object o = constructor.newInstance();
Method method = aClass.getMethod(mName);
method.invoke(o);
}
}
这样写的好处是什么?
这里配置文件里面写的是className是Student学生类,方法写的是function方法
那么如果我想用Teacher类的show方法呢?
我只需要修改配置文件里面的信息,比如改为
className = test.reflexDemo.PropertyDemo.Teacher
methodName = show
然后,其他的什么都不用改,直接运行main方法
会发现这里使用的是Teacher类的show方法
实例二
通过反射,来给集合赋值
package test.reflexDemo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListDemo {
public static void main(String[] args) throws Exception{
List list = new ArrayList();
//获取Class对象
Class c = list.getClass();
//根据Class对象来获取构造方法
Constructor constructor = c.getConstructor();
//通过构造方法来创建实例对象
List o = (List)constructor.newInstance();
//获取Method对象,获取的方法含参,因此要加上class文件名
//这里没有给List加泛型,因此集合里面可以传入各种类型的元素
//这里没有具体的class文件类型,就可以用Object.class
Method add = c.getMethod("add",Object.class);
//通过Method对象调用方法
add.invoke(o,1);
add.invoke(o,10);
add.invoke(o,20);
add.invoke(o,"zhang");
add.invoke(o,1.11);
Iterator iterator = o.iterator();
while(iterator.hasNext()){
Object obj = iterator.next();
System.out.println(obj);
}
}
}