我在工厂模式上做R& D我开发了以下代码。现在我知道子类是Dog
和Cat
,但请告诉我。如果我想通过在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";
}
}
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中传递类名,并创建该子类的对象。
答案 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
。