• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ネストしたenumへのリフレクションによるアクセス)

ネストしたenumへのリフレクションによるアクセス

このQ&Aのポイント
  • GameクラスのネストしたenumであるGameStateにJUnitのテストコードからアクセスする方法について質問です。
  • GameStateがprivateで宣言されているため、リフレクションを使用してアクセスする方法を知りたいです。
  • テストコードからGameStateにアクセスする方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • vaguechat
  • ベストアンサー率85% (47/55)
回答No.3

enumなのでClass#getEnumConstants()でenumクラスの要素の配列を得る方がシンプルか…… 要素の特定は、宣言した名前を返すname()で返ってくる文字列と比較するか、 宣言順を変えることがないのならインデックスで指定(TITLEなら0)してもいいかも。 どちらにしてもGameStateという名前は使えないのでObjectとして受けて精々Enumにキャストするくらいしかないのは変わらない。 Object[] game_gamestate = null; for (Class cls : Game.class.getDeclaredClasses()) { if (! "GameState".equals(cls.getSimpleName())) continue; game_gamestate = cls.getEnumConstants(); break; } Object game_gamestate_title = null; for (Object o : game_gamestate) if (((Enum)o).name().equals("TITLE")) game_gamestate_title = o; または Object game_gamestate_title = game_gamestate[0];

hiropon_su
質問者

お礼

こちらのコードを参考にして、無事テストに成功しました。 大変勉強になりました。ありがとうございます。

その他の回答 (2)

  • vaguechat
  • ベストアンサー率85% (47/55)
回答No.2

> // Game.GameStateクラス内で定義されたTITLEというGame.GameState型の静的変数への参照を得る。 正確には、 // Game.GameStateクラス内で定義されたGame.GameState型の静的変数TITLEに代入されているインスタンスへの参照を得る。 でした。

  • vaguechat
  • ベストアンサー率85% (47/55)
回答No.1

Game.GameStateクラスはGameクラスのメンバーではあるがフィールドではない。 したがって、 > c.getDeclaredField("GameState"); では必要としているものを得ることはできない。 特にJUnit用のテストコードを書いたりはしないが、大雑把なサンプルを以下に示す。 import java.lang.reflect.Field; public class GameTest { public static void main(String[] args) throws Exception { // Game.GameStateクラス内で定義されたTITLEというGame.GameState型の静的変数への参照を得る。 Object game_gamestate_title = null; for (Class<?> cls : Game.class.getDeclaredClasses()) { // メンバーとして定義されたクラスのリストから if (! "GameState".equals(cls.getSimpleName())) continue; // GameStateでなければ無視 game_gamestate_title = cls.getDeclaredField("TITLE").get(null); break; } // Gameクラス内で定義されたstateというフィールドのFieldインスタンスを得る。 Field game_state = Game.class.getDeclaredField("state"); game_state.setAccessible(true); // privateフィールドへのアクセスに必要 // Gameインスタンスを生成しこれを使い何かを何かする。 Game game = new Game(); //... gameを使って何かを何か // この時点でのstateの内容を得てGame.GameState.TITLEであることを表明する。 Object state = game_state.get(game); assert(state == game_gamestate_title); } } java -ea GameTestで実行すればstateがGame.GameState.TITLEでなければAssertionErrorを吐く。

関連するQ&A

専門家に質問してみよう