クラスのパスの文字列表現があります。これは3つのクラスのいずれかであり、すべて同じインターフェイスAdapterを実装しますが、値が何であるかはわかりません。
- 「com.example.adapters.Music」
- 「com.example.adapters.Video」
- 「com.example.adapters.Photo」
上記の3つの文字列のいずれかを保持する変数のみが与えられた場合、実際のクラスの使用可能なインスタンスを取得するにはどうすればよいですか?
次を使用できます。
String name = "com.example.adapters.Music";
Object obj = Class.forName(name).newInstance();
次に、正しいタイプにキャストobj
する必要があります(おそらく、名前を調べるか、を使用してinstanceof
)。obj
クラスに共通の基本クラス(またはそれらが実装するインターフェース)があり、それがサブクラスであることだけを知っていると、より簡単に使用できます。
これは、クラスにデフォルトのコンストラクターがある場合にのみ機能します。それ以外の場合は、リフレクションを使用してコンストラクターメソッドのインスタンスを取得し、適切な引数を使用して呼び出す必要があります。
クラスに引数のないコンストラクターがある場合、そのパッケージ修飾クラス名(たとえば、「java.lang.Integer」)からオブジェクトを作成するには、通常、次のメソッドを使用します。
Class.forName
Class.newInstance
For e.g MusicClass mObj = Class.forName(<string name>).newInstance();
引数をコンストラクターに渡す必要がある場合は、代わりに次の選択肢を使用できます。
Class.getConstructor
Constructor.newInstance
3つの文字列を保持するために文字列配列を使用できます
String names[]= {"com.example.adapters.Music","com.example.adapters.Video","com.example.adapters.Photo"};