No.5ベストアンサー
- 回答日時:
#2です。
>Menuにクラス名を登録しておき、指定されたMenuのクラスをスタートするような
ことを考えていました。
1つのメニュー項目(メニュー機能)に1つのクラスを対応させ、
選択されたメニュー項目に対応したクラスを実行するわけですね。
その場合、それらのクラスには全て「メニュー項目になる」という共通点がありますね?
その共通点をインターフェースとして定義しておきます。
interface IMenuItem
{
/** メニュー項目の名前*/
public String getCommandName();
/** メニュー項目の実行*/
public void execute();
}
全てこのインターフェースを実装して下さい。
また、実行時には
Class cls = Class.forName(className);
IMenuItem menuItem = (IMenuItem)cls.newInstance();
menuItem.execute();
となります。
No.6
- 回答日時:
#5です。
もう少し、補足しておきます。前回も示した通り、Class.forName("").newInstance()で受ける型は、
ある程度限定して使うことがほとんどです。
逆に、限定しない(Object型で受ける)ということは、
インスタンスを生成した後に実行させること(実行させる目的)も
はっきりしていないということになります。
(前回の例では、メニュー項目を実行させる目的で、インスタンスを生成したわけです。)
ほとんどの場合、クラスをインスタンス化するには、何らかの目的があるはずですから、
その目的をグループ化したクラス等で受ければいいわけです。
あまり考えられませんが、インスタンス化するクラスが、
・Stringだったらlength()を実行
・ArrayListだったらsize()を実行
などのように、全く関係ないクラスがインスタンス化される可能性がある場合は、
Object obj = Class.forName(className).newInstance();
のように、Object型で受ければOKです。
その後、
if(obj instanceof String){
String s = (String)obj;
System.out.println("length=" + s.length() );
}else
if(obj instanceof ArrayList){
ArrayList list = (ArrayList)obj;
System.out.println("size=" + list.size() );
}
のようになります。
ですから、受けるクラス名が動的に指定されなくても問題はありません。
No.4
- 回答日時:
>リターンを受けるクラス名が、動的に指定されていないため、具体的な利用方法が分かりませんでした
>Class.forNameのパラメータが動的に指定できるとき、
受け入れるクラス名を動的に指定できないのであれば、結果的に動的にクラスを生成できないのでは
Fooというクラスの変数
Foo f;
があった場合、fに代入できるインスタンスは
「Fooクラスのインスタンス」
のみならず、
「『Fooを継承しているサブクラス』のインスタンスすべて」
が代入可能。(スーパークラス型への代入)
また、Fooというのが(クラス名でなく)インターフェース名だった場合、
Foo f;
なる変数fに代入できるのは、
「『インターフェースFooをインプリメント(実装)しているクラス』のインスタンスすべて」
が代入可能。(インタフェース型への代入)
----
つまり、上記の2通りのいずれかを満たしていれば、
代入先の変数の「型」の名前が固定されていても、
そこに代入するインスタンス(のクラス)は動的に「選べる」ことになる。
Javaの「多態(ポリモーフィズム)」について調べみよう。
この辺の話をわかりやすく解説しているはずだ。
Javaプログラミングにおける超基本事項であり、
最重要事項の1つでもある。
------
↓実験すべし
import java.awt.*;
public class Test {
public static void main(String[] args) {
String s;
if ("a".equals(args[0])) {
s = "java.awt.Rectangle";
} else if ("b".equals(args[0])) {
s = "java.awt.Frame";
}else {
s = "java.awt.Point";
}
Object o=null;
try {
o = Class.forName(s).newInstance();//※
}catch(Exception e) {e.printStackTrace();}
System.out.println(o);
}
}
参考URL:http://msugai.fc2web.com/java/polymorphism.html
No.3
- 回答日時:
思いつく例を
2点挙げます
まず、1つ目
No1で例にあげられたドライバーのクラス名が
プロパティーファイルに記述されている
ようなケースでは、
Class.forNameを使って動的にする以外に
方法がない。
2つ目
抽象クラス
ItemFactoryの中で
this.getClass().getName()
で得られる自身のクラス名の
「Factory」という文言を「Product」
に変えたクラスのインスタンスを
Class.forName( を使ったやり方で
生成する
コードがあるメソッドがあったとして。
継承クラス
ItemFactoryAクラスにおけるそのメソッドの
挙動としては、
ItemProductAクラスのインスタンスを
生成する。
継承クラス
ItemFactoryBクラスにおけるそのメソッドの
挙動としては、
ItemProductBクラスのインスタンスを
生成する。
なぜなら、
this.getClass().getName()
の部分の
thisは実行時の
ItemFactoryAや
ItemFactoryBの
インスタンスだから。
Menuにクラス名を登録しておき、指定されたMenuのクラスをスタートするようなことを考えていました。
お教えを参考にさせていただきます。
有難うございました。
No.2
- 回答日時:
まず、確認をしておきましょう。
Class.forName("Hoge").newInstance();
というのは、
Class cls = Class.forName("Hoge");
Hoge hg = (Hoge)cls.newInstance();
と同じ意味で、さらに
Hoge hg = new Hoge();
と同じ意味です。
また、インスタンス生成時にタイプを限定したくないのであれば、
Class cls = Class.forName("Hoge");
Object hg = cls.newInstance();
となります。
指定したオブジェクトのクラス名を知りたいなら、
Hoge hg = new Hoge();
Class cls = hg.getClass();
System.out.println(cls.getName());
でOKです。
*何が知りたいのかよくわからなかったので、
いっぱい書いてしまいました。
No.1
- 回答日時:
java.sql.Driverクラスなんかのインスタンスを生成
する場合なんかによく使ったりします。
・
・
OracleDriver driver = (Driver)Class.forName("oracle.jdbc.driver.OracleDriver").newInstnace();
・
・
そのほかにも動的にクラスが生成できるため、FactoryMethod
パターンなんかにも適応できると思います。
この回答への補足
Class.forNameのパラメータが動的に指定できるとき、
受け入れるクラス名を動的に指定できないのであれば、結果的に動的にクラスを生成できないのではと考えています。
例えば、次のような使い方が出来ないのかお教えいただきたいのです。よろしくご教示下さい。
String strClassW;
String strClassA "ClassA";
String strClassB "ClassB";
if (arg[0].equals("a")) {
strClassW = strClassA;
} else {
strClassW = strClassB;
}
以下の表記はjavaで許されるものではないと思いますが、
Class(strClassW) class = Class.forName(strClassW).newInstance();
System.out.println(class.toString());
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PostgreSQL 【PostgreSQL】行の値の並びを変えるには 1 2023/03/21 16:46
- 英語 分離不定詞 1 2023/07/16 17:29
- HTML・CSS サルワカさんの吹き出しのスタイルシートについて。 https://saruwakakun.com/h 2 2022/10/28 22:55
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- JavaScript jQueryで同じクラス名のものを別物として扱いたい 1 2022/06/17 14:14
- JavaScript javascriptで文字挿入でtoggleみたいなのはありますか? 2 2023/02/14 21:53
- JavaScript 【Javascript】ボタンクリックで2つのclassに対し、それぞれ別のclassを追加したい 1 2022/07/29 20:52
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- JavaScript 指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードを教えてください 2 2023/04/27 17:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数名の付け方
-
private static という変数の修飾
-
インスタンス参照でアクセスで...
-
C# インスタンスの破棄
-
複数の変数を宣言する時、同時...
-
C#において、同じインスタンス...
-
VB.NET getとsetの概念がわかり...
-
他のファイルの変数参照
-
生成したインスタンスを削除す...
-
非staticフィールドを参照でき...
-
VB.netで標準モジュールからフ...
-
変数の参照でエラーが出てしま...
-
ファイル読み込み/書き込み速度...
-
VB.NET Newしたものを変数に代...
-
フィールドでのnewとコンストラ...
-
フォームの存在をチェックする方法
-
整数の引数に列挙を使ったとき
-
インスタンスを同じ名前で作成...
-
文字列を日付に変換でParseExce...
-
SerialPort処理でInvokeメソッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
複数の変数を宣言する時、同時...
-
private static という変数の修飾
-
VB.NET getとsetの概念がわかり...
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
C# インスタンスの破棄
-
newしないインスタンス?実体化...
-
SQLを連続発行する時の正しい(?...
-
「インスタンス」の意味をわか...
-
文字列を日付に変換でParseExce...
-
変数の参照でエラーが出てしま...
-
フォームの存在をチェックする方法
-
javaのクラスの作り方、エラー...
-
オブジェクト参照がオブジェク...
-
String a = "a"; と String b =...
-
エクセル(複数インスタンス)...
-
C#「オブジェクト参照が必要で...
-
他のファイルの変数参照
おすすめ情報