需求
有如下动物类和动物工厂类,分别创建动物类对象。
动物类
//动物interface Animal {public void eat();}class Cat implements Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}}class Dog implements Animal {@Overridepublic void eat() {System.out.println("狗吃肉");}}class Monkey implements Animal {@Overridepublic void eat() {System.out.println("猴子吃香蕉");}}
工厂类
interface Factory {public Animal createAnimal();}class CatFactory implements Factory{@Overridepublic Animal createAnimal() {return new Cat();}}class DogFactory implements Factory {@Overridepublic Animal createAnimal() {return new Dog();}}class MonkeyFactory implements Factory {@Overridepublic Animal createAnimal() {return new Monkey();}}
未使用反射时
@Testpublic void demo1(){Factory factory = new DogFactory(); //创建榨汁机Animal animal = factory.createAnimal();animal.eat();//狗吃肉factory = new CatFactory();//创建榨汁机animal = factory.createAnimal();animal.eat();//猫吃鱼}
使用Class.forName API 创建实例
@Testpublic void demo2() throws ClassNotFoundException, InstantiationException, IllegalAccessException {Class clazz = Class.forName("cn.giteasy.reflect.DogFactory");Factory factory = (Factory) clazz.newInstance();Animal animal = factory.createAnimal();animal.eat();}
读取配置文件创建类的实例
cn.giteasy.reflect.MonkeyFactorycn.giteasy.reflect.CatFactorycn.giteasy.reflect.DogFactory
@Test
public void demo3() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {
//需要修改要创建的类时,只需要修改配置文件即可
BufferedReader br = new BufferedReader(new FileReader("config.properties"));
Class clazz;
Factory factory;
List<String> list = br.lines().collect(Collectors.toList());
for (String line : list) {
clazz = Class.forName(line); //获取该类的字节码文件
factory = (Factory) clazz.newInstance();//创建实例对象
Animal animal = factory.createAnimal();
animal.eat();
}
/**
* 输出结果:
*
* 猴子吃香蕉
* 猫吃鱼
* 狗吃肉
*/
}
