【发布时间】:2019-10-28 21:10:00
【问题描述】:
我对反思很陌生,我想获得一些建议/帮助。我正在尝试使用基类中的反射来获取子类名称。我有多个子类(猫、狗、青蛙等),它们都扩展了基类(动物)。
我想做的是从子类本身获取类名并将它们传递给构造函数,这样 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());
}
}
【问题讨论】:
-
为什么要为此使用反射?
-
这不是我想要使用反射的实际项目。我用它作为例子来说明我想说什么
-
您可以在
Animal-getName()或其他东西上创建一个抽象方法,而不是使用反射,然后每个子类将实现该方法以返回任何东西(“Dog”,“猫”等)。然后对于Animal的任何实例,您都可以调用animal.getName()并得到正确答案。 -
也许您想要class literal,例如
Dog.class或Cat.class?或者你想列出Animal的所有现有子类?
标签: java oop reflection