クラス内のメソッド定義取得
id:devworks の
private なフィールドから値を取得/設定する - devworks
についてのエントリに便乗。
たとえばこんな「dai.Test」っていうクラスがある場合。
package dai; class Test { private String test(String str1, String str2) { return str1 + str2; } }
このクラス内のprivateメソッドにアクセスする方法は以下の通り。
try { Class c = Class.forName("dai.Test"); // メソッド取得 // Class#getMethodはpublicメソッドのみ取得可能。 // Class#getDeclaredMethodは全メソッド取得可能。 Method m = c.getDeclaredMethod( "test", String.class, String.class); // privateメソッドアクセス許可 m.setAccessible(true); // メソッド呼出 m.invoke(c.newInstance(), "あべし", "ひでぶ"); } catch (Exception e) { e.printStackTrace(); }
そして、このクラス内のすべてのメソッドの
- メソッド名
- 引数の型
- 返却値の型
を取得/出力する方法は以下の通り。
try { Class c = Class.forName("dai.Test"); for(Method m : c.getDeclaredMethods()) { // メソッド名 System.out.println(m.getName()); // 引数の型 for(Class param : m.getParameterTypes()) { System.out.println(param.getName()); } // 返却値の型 System.out.println(m.getReturnType().getName()); } } catch (Exception e) { e.printStackTrace(); }
各メソッドのメソッド名、引数、返却値がわかるので、指定クラス内のメソッドをすべて呼び出し、とかもできるですね。
こういうのどうやるんー?といまの現場で聞かれたのでちょっと書いてみた。