1. ホーム
  2. java

[解決済み] Javaでクラスの名前を指定してインスタンス化する方法はありますか?

2022-08-27 11:53:18

質問

私は質問として探していた。 その文字列名からクラスをインスタンス化する これは、その名前を持っているときにクラスをインスタンス化する方法を記述しています。Javaでそれを行う方法はありますか?私はパッケージ名とクラス名を持っており、私はその特定の名前を持つオブジェクトを作成できるようにする必要があります。

どのように解決するのですか?

2つの方法があります。

方法1 - 引数なしのコンストラクタを持つクラスのみ。

クラスが引数なしのコンストラクタを持つ場合、引数なしのコンストラクタを持つクラスに対して、引数なしのコンストラクタを持つクラスに対して、引数なしのコンストラクタを持つクラスに対する Class オブジェクトを使用します。 Class.forName() を使用し newInstance() メソッドを使用してインスタンスを作成します(ただし、このメソッドはしばしば は悪とみなされます。 というのは、Javaのチェックされた例外を打ち負かすことができるからです)。

例えば

Class<?> clazz = Class.forName("java.util.Date");
Object date = clazz.newInstance();

方法2

クラスが引数のないコンストラクタを持たない場合にも有効な、より安全な別の方法は、クラスオブジェクトに問い合わせ、その Constructor オブジェクトを取得し newInstance() メソッドを呼び出します。

Class<?> clazz = Class.forName("com.foo.MyClass");
Constructor<?> constructor = clazz.getConstructor(String.class, Integer.class);
Object instance = constructor.newInstance("stringparam", 42);

どちらの方法も リフレクション . 通常、以下のような発生しうる様々な例外をキャッチする必要があります。

  • JVMがあなたのクラスを見つけられないか、ロードできない。
  • インスタンス化しようとしているクラスが、正しい種類のコンストラクタを持っていない。
  • コンストラクタ自体が例外を発生させた
  • 呼び出そうとしているコンストラクタは public ではありません。
  • セキュリティマネージャがインストールされており、リフレクションの発生を妨げています。