- ベストアンサー
privateのメソッドをリフレクションで呼び出す方法
- 私はprivateやpackage privateのメソッドをリフレクションという方法で呼び出すことができるのか疑問に思っています。
- はい、privateやpackage privateのメソッドもリフレクションを使用して呼び出すことができますが、いくつかの制約があります。
- 代替の方法として、privateやpackage privateメソッドを外部から呼び出すために、継承やモックを使用する方法もあります。
- みんなの回答 (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
その他の回答 (1)
- hoge_piyo
- ベストアンサー率57% (15/26)
とりあえずコンストラクタもメソッドも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
お礼
お返事が遅くなりごめんなさい。 うまく生成や実行ができました。有難うございます。
お礼
お返事が遅くなりごめんなさい。 うまく生成や実行ができました。有難うございます。 今回はjunit-addonsというものは使えそうにないのですが、使用許可が降りるプロジェクトはぜひ検討したいと思います。