私は次のような疑問を抱いていました:文字列名からクラスをインスタンス化するこれは、クラス名があるときにクラスをインスタンス化する方法を説明します。Java でこれを行う方法はありますか? パッケージ名とクラス名があり、その特定の名前を持つオブジェクトを作成できる必要があります。
ベストアンサー1
ふたつのやり方:
方法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がクラスを見つけられないか、ロードできない
- インスタンス化しようとしているクラスに適切な種類のコンストラクタがありません
- コンストラクタ自体が例外をスローした
- 呼び出そうとしているコンストラクタはパブリックではありません
- セキュリティマネージャがインストールされており、リフレクションの発生を防止しています。