• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:privateのメソッドをリフレクションで呼び出す方法)

privateのメソッドをリフレクションで呼び出す方法

このQ&Aのポイント
  • 私はprivateやpackage privateのメソッドをリフレクションという方法で呼び出すことができるのか疑問に思っています。
  • はい、privateやpackage privateのメソッドもリフレクションを使用して呼び出すことができますが、いくつかの制約があります。
  • 代替の方法として、privateやpackage privateメソッドを外部から呼び出すために、継承やモックを使用する方法もあります。

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

java.lang.reflect.Constructor や java.lang.reflect.Method を使えば、privateなコンストラクターしか持たないクラスの生成や、privateメソッドの呼び出しが出来ます。 以下はその例です。 生成したいクラスの定義 -------------------------------------- public class Aaa { private Aaa() {} private void func() { /* 何かしらの処理 */ } } ------------------------------------------------------------- Aaa の生成・利用 -------------------------------------------- // オブジェクトを取得する。 Constructor<Aaa> constructor = Aaa.class.getDeclaredConstructor(); constructor.setAccessible(true); Aaa a = constructor.newInstance(); // Privateメソッド「func」を呼び出す。 Method method = Aaa.class.getDeclaredMethod("func"); method.setAccessible(true); method.invoke(a); ------------------------------------------------------------- 蛇足ですが、製品用(本番用)のコードの中でこのような事をするのは止めた方が良いでしょう。アクセス修飾子があてにならなければ、保守が非常に困難になります。 テストや使い捨てのツールならば良いと思いますが。 なお、 junit-addons というテスト用のライブラリにprivateメンバーにアクセスする機能が有りますので、テストの時などはそれを使うと楽です。 http://www.itarchitect.jp/technology_and_programming/-/34161-2.html

参考URL:
http://www.ne.jp/asahi/hishidama/home/tech/java/reflection.html#private_member
_alias_
質問者

お礼

お返事が遅くなりごめんなさい。 うまく生成や実行ができました。有難うございます。 今回はjunit-addonsというものは使えそうにないのですが、使用許可が降りるプロジェクトはぜひ検討したいと思います。

その他の回答 (1)

  • hoge_piyo
  • ベストアンサー率57% (15/26)
回答No.1

とりあえずコンストラクタもメソッドもprivateにしたクラスのメソッドを呼び出すサンプルです。サンプルなので、色々なチェックをかなり省いていますが、とりあえず動くはずです。 class Test { public static void main(String[] args) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException{ Method[] hogeMethods = hoge.class.getDeclaredMethods(); Constructor<hoge> hogeConstructor = (Constructor<hoge>) hoge.class.getDeclaredConstructors()[0]; hogeConstructor.setAccessible(true); hoge hogeInstance = hogeConstructor.newInstance(); for(Method m :hogeMethods){ m.setAccessible(true); m.invoke(hogeInstance); } } } class hoge{ private hoge(){} private void a(){ System.out.println("aがよばれました"); } } ポイントはsetAccessibleというのを設定することによって、呼び出せるようになるということです。 あとはClassクラスや、Methodクラス、を中心にreflectパーケージの各クラスにリフレクション用のメソッドが用意されているので、JavaDocを読んでみてください。 http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Class.html http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/reflect/Method.html http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/reflect/package-summary.html

_alias_
質問者

お礼

お返事が遅くなりごめんなさい。 うまく生成や実行ができました。有難うございます。

関連するQ&A