如何在多个类中使用反射来扩展Java中的基类

问题描述 投票:0回答:1

我对反思非常陌生,我想获得一些建议/帮助。我试图在基类中使用反射来获取子类名称。我有多个子类(猫,狗,青蛙等。),它们都扩展了基类(动物)。

我想做的是从子类本身获取类名,并将其通过构造函数传递,因此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());
    }
}
java oop reflection
1个回答
0
投票

我不明白为什么要使用子类的名称。如果问题是根据类的名称实例化一个类,则最好使用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而不是子类。希望对您有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.