我对反思非常陌生,我想获得一些建议/帮助。我试图在基类中使用反射来获取子类名称。我有多个子类(猫,狗,青蛙等。),它们都扩展了基类(动物)。
我想做的是从子类本身获取类名,并将其通过构造函数传递,因此Animal不必实例化数十个子类。以下是我不尝试执行的操作的示例。
[如果有一种方法可以动态地获取子类名称,而无需经历实例化每个子类的麻烦,那么我很乐意看到它。非常感谢您的帮助。
class Dog extends Animal {
private String s;
public Dog() {
s = "Bark";
}
public void method() {
System.out.println("Dogs " + s);
}
}
class Cat extends Animal {
private String s;
public Cat() {
s = "Meow";
}
public void method() {
System.out.println("Cats " + s);
}
}
class Animal {
public static void main(String args[]) throws Exception {
Dog dog = new Dog();
Cat cat = new Cat();
Class cls = dog.getClass();
System.out.println("The name of class is " + cls.getName());
Constructor constructor = cls.getConstructor();
System.out.println("The name of constructor is " + constructor.getName());
}
}
我不明白为什么要使用子类的名称。如果问题是根据类的名称实例化一个类,则最好使用Abstract Factory模式。您可以创建一个包含您知道的动物的枚举
enum ANIMALS {
DOG, CAT
}
您可以创建动物界面
public interface Animal {
}
将Animal扩展为默认类的类
public class Dog implements Animal {
}
然后最后将AnimalAbstractFactory命名为
public class AnimalAbstractFactory {
public enum ANIMALS {
DOG, CAT
}
public Animal createAnimal(ANIMALS animal) {
switch (animal) {
case DOG:
return new Dog();
case CAT:
return new Cat();
}
return null;
}
}
注意,现在您不需要知道子类来实例化动物。另请注意,createAnimal返回的是Animal而不是子类。希望对您有所帮助。