1

重複の可能性:
リフレクションによる工場設計パターンについて

私は工場パターンの研究開発を行っていましたが、以下のコードを開発しました。現在、サブクラスがDogCatであることはわかっていますが、教えてください。でクラス名を渡すことでリフレクションを介して同じことを達成したい場合はどうすればよいmain.javaですか?

動物

public abstract class Animal {
    public abstract String makeSound();
}

public class Dog extends Animal {

    @Override
    public String makeSound() {
        return "Woof";
    }
}

ネコ

public class Cat extends Animal {

    @Override
    public String makeSound() {
        return "Meow";
    }
}

アニマルファクトリー

public class AnimalFactory {

    public Animal getAnimal(String type) {
        if ("canine".equals(type)) {
            return new Dog();
        } else {
            return new Cat();
        }
    }
}

主要

public class Main {

    public static void main(String[] args) {
        AnimalFactory animalFactory = new AnimalFactory();

        Animal a1 = animalFactory.getAnimal("feline");
        System.out.println("a1 sound: " + a1.makeSound());

        Animal a2 = animalFactory.getAnimal("canine");
        System.out.println("a2 sound: " + a2.makeSound());
    }
}

タイプを決定する必要さえないように、リフレクション機能を追加する方法を教えてください。メインのJavaにクラス名を渡すだけで、そのサブクラスのオブジェクトが作成されます。

4

2 に答える 2

2
public Animal getAnimal(String clName) {
  try {
      return (Animal) Class.forName(clName).newInstance();
  } catch (Exception e) {
      throw new RuntimeException(e);
  }
}
于 2012-05-02T17:06:29.693 に答える
2

クラスの完全修飾名を渡すと、次のようにインスタンス化できます。

return (Animal) Class.forName(fullyQualifiedClassName).newInstance();

ClassCastException を回避するには、を呼び出す前に、 の返されたクラスClass.forName()が実際に のサブクラスであることをテストできます。そのために使用します。AnimalnewInstance()isAssignableFrom

于 2012-05-02T17:06:43.720 に答える