作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对反射(reflection)非常陌生,我想获得一些建议/帮助。我正在尝试使用基类中的反射来获取子类名称。我有多个子类(猫、狗、 Frog 等),它们都扩展了基类(动物)。
我想要做的是从子类本身获取类名,并将它们传递给构造函数,这样 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());
}
}
最佳答案
我不明白你为什么想要子类的名称。如果问题是根据类的名称实例化类,那么最好使用抽象工厂模式。您可以创建一个包含您知道的动物的枚举
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,而不是子类。我希望它有帮助。
关于java - 如何在java中使用反射扩展基类的多个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58598453/
我是一名优秀的程序员,十分优秀!