プロが教える店舗&オフィスのセキュリティ対策術

Webアプリ上でリフレクションにてとあるクラスのメソッドを実行するサンプルを作成して
見たのですがうまく動きませんでした。最後のmethod.invoke()の処理にてExceptionが発生し、
java.lang.IllegalArgumentException: object is not an instance of declaring class
と表示されてしまいます。

作成したサンプルは下記なのですがどこが原因かお分かりになりますでしょうか。


try {
Class cls = Class.forName("dao.TestDao");

// 引数の型をセット
Constructor constructor = cls.getDeclaredConstructor(HttpSession.class);
constructor.setAccessible(true);

// 引数を渡してオブジェクトを生成
Object obj = constructor.newInstance(session);

Method method = cls.getDeclaredMethod("getDataDao", int.class);
method.setAccessible(true);

Object result = method.invoke(cls, new Integer(100));
} catch (Exception e) {
e.printStackTrace();
}





// このクラスのgetDataDao()をリフレクションにて実行
public class TestDao {

HttpSession session = null;

public TestDao(HttpSession session)
{
this.session = session;
}


public List<String> getDataDao(int iNo) {

List<String> list = new ArrayList<String>();

list.add((String)session.getAttribute("1"));
list.add((String)session.getAttribute("2"));
list.add((String)session.getAttribute("3"));
list.add((String)session.getAttribute("4"));
list.add((String)session.getAttribute("5"));

return list;
}
}

A 回答 (2件)

あなたはそうなってほしいと思っているのかもしれませんが, 残念ながら質問にあがっているプログラムはその意図にそっていません.



「リフレクションを使わない場合」の test に対応するオブジェクトは, リフレクションを使った場合のどれですか?
    • good
    • 0
この回答へのお礼

>>「リフレクションを使わない場合」の test に対応するオブジェクトは, リフレクションを使った場合のどれですか?

ご回答ありがとうございます。
「リフレクションを使わない場合」の test に対応するオブジェクトは


Object obj = constructor.newInstance(session);
で取得したobjであるため

method.invoke(obj, new Integer(100));
としたところ実行できました。ありがとうございました。

お礼日時:2014/10/03 21:09

これ, リフレクションを使わなかったらどのようなコードに対応すると思う?

この回答への補足

リフレクションを使わない場合、以下のコードが実行されることを想定して書きました。

TestDao test = new TestDao(session); // HttpSessionオブジェクトをセット
test.getDataDao(100); // getDataDao()メソッドの実行

補足日時:2014/10/03 07:09
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!