关于工厂设计模式通过java中实现的反射

时间:2012-05-02 17:04:36

标签: java oop reflection

  

可能重复:
  Regarding factory design pattern through reflection

我在工厂模式上做R& D我开发了以下代码。现在我知道子类是DogCat,但请告诉我。如果我想通过在main.java中传递类名来通过反射实现同样的事情该怎么办?

动物

public abstract class Animal {
    public abstract String makeSound();
}

public class Dog extends Animal {

    @Override
    public String makeSound() {
        return "Woof";
    }
}

public class Cat extends Animal {

    @Override
    public String makeSound() {
        return "Meow";
    }
}

AnimalFactory

public class AnimalFactory {

    public Animal getAnimal(String type) {
        if ("canine".equals(type)) {
            return new Dog();
        } else {
            return new Cat();
        }
    }
}

主要

public class Main {

    public static void main(String[] args) {
        AnimalFactory animalFactory = new AnimalFactory();

        Animal a1 = animalFactory.getAnimal("feline");
        System.out.println("a1 sound: " + a1.makeSound());

        Animal a2 = animalFactory.getAnimal("canine");
        System.out.println("a2 sound: " + a2.makeSound());
    }
}

请告诉我如何在其中添加反射功能,以便我甚至不需要确定类型,只需在主java中传递类名,并创建该子类的对象。

2 个答案:

答案 0 :(得分:2)

public Animal getAnimal(String clName) {
  try {
      return (Animal) Class.forName(clName).newInstance();
  } catch (Exception e) {
      throw new RuntimeException(e);
  }
}

答案 1 :(得分:2)

如果您传递了类的完全限定名称,则可以将它们实例化为:

return (Animal) Class.forName(fullyQualifiedClassName).newInstance();

为了避免ClassCastException,您可以在调用Class.forName()之前测试返回的Animal类确实是newInstance()的子类。请使用isAssignableFrom