【问题标题】:How to use reflection with multiple classes extending the base class in java如何在java中扩展基类的多个类使用反射
【发布时间】: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.classCat.class?或者你想列出Animal 的所有现有子类?

标签: java oop reflection


【解决方案1】:

我不明白您为什么想要子类的名称。如果问题是根据其名称实例化一个类,最好使用抽象工厂模式。您可以创建一个包含您认识的动物的枚举

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 而不是子类。希望对你有帮助。

【讨论】:

  • 上面的代码只是我不想使用反射的一个例子。不是实际的。我有几十个扩展基类的子类,例如,如果它们被调用,我试图获取它们的类名。我想到的唯一方法是实例化基类中的每个子类以获取每个名称(如上面的示例)。这不是一种有效的方法。我正在尝试了解如何更有效地使用反射
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 2013-04-19
相关资源
最近更新 更多