- PR -

【質問】クラス名の動的取得について

1
投稿者投稿内容
るしぃ。
常連さん
会議室デビュー日: 2004/09/16
投稿数: 21
投稿日時: 2004-11-24 18:03
Class callClass = Class.forName(クラス名);
Object infoObject = callClass.newInstance();

AAA aaa = (AAA)infoObject;

上記で作成したインスタンスを、動的に変化する「Class.forName(クラス名)」別に
AAA部分を指定したいのですが、可能でしょうか?
例)
  Class.forName(info.data);のときは、
  AAA aaa = (AAA)infoObject;

Class.forName(info.temp);のときは、
  BBB aaa = (BBB)infoObject;

やりたいことは、Class.forNameの与えられた引数によって、
見るクラスを分けたいのです。

初心者のため、伝わりにくい点もあるかと思いますが、
なにとぞ宜しくお願いします。
影フリー
常連さん
会議室デビュー日: 2004/11/12
投稿数: 39
お住まい・勤務地: 東京都
投稿日時: 2004-11-24 18:41
望ましくないですが
Object infoObject = callClass.newInstance();
if( infoObject instanceof AAA ){
AAA aaa = (AAA)infoObject;
}else if( infoObject instanceof BBB ){
BBB bbb = (BBB)infoObject;
}
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-11-24 18:52
javaはキャストそのものを動的に行うことはできません。

ですので、必要なだけキャストの処理を静的に記述しなければいけません。
当然、その後の処理も必要なだけinstanceofで分岐しなければいけません。

しかし型に互換性を持たせれば、その型にキャストするだけでよいので、
特に分岐する必要はありません。
下のソースを参考にしてみてください。

コード:
interface Hoge{

	public abstract void piyo();

}

class HogeImpl1{

	public void piyo(){
		System.out.println("Hoge1");
	}
}

class HogeImpl2{

	public void piyo(){
		System.out.println("Hoge2");
	}
}

public class Main{

	public static void main(String[] args) throws Exception{
		String hoge = "Hoge1";
		Class cls = Class.forName(hoge);
		Object obj = cls.newInstance();
		Hoge h = (Hoge) obj;				//静的なキャスト
		h.piyo();
	}
}


vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2004-11-24 20:27
どうしてもそうしなければならない理由がないのであれば、
設計を見直したほうが良いと思います。

共通のインターフェイスCCCを作ってAAAやBBBにimplementsし、
挙動の違いはポリモーフィズムで実現すべきでしょう。
るしぃ。
常連さん
会議室デビュー日: 2004/09/16
投稿数: 21
投稿日時: 2004-12-12 05:02
みなさん、ご返信ほんとうにどうもありがとうございました。m(._.)m

実際にとった方法ですけれども、
みなさんのおっしゃるとおり、
インターフェイスをつくって、AAAとBBB内それぞれに
同じメソッド名をつくって対処しました。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)