Javaで抽象度の高い実装を行うときに必要となる型情報の活用法について。
できるとできないとでプログラムの応用範囲が変わってくるのでメモっときます。
こちらのエントリーと合わせて読むといいと思います。
なお解説はすべてコメントに入れてあります。
クラスインスタンスの作成方法
これが最初のうちは全然わかりませんでした。
要はあるクラスのメソッド、パラメーターなどそのクラス自体の情報を取得したいときに使われます。
例えばStringのクラス情報を取得したいときはClass<String>になります。
Class<T>(ジェネリクスでの定義)やClass<?>(特定の型でなく汎用的な型情報の取得)などにも使われます。
以下の方法で取得できます。
1 2 3 4 5 6 7 8 |
Class<Test> clazz = Test.class; //インスタンスからのクラスインスタンス生成 Test test = new Test(); Class<? extends Test> clazz2 = test.getClass(); //どのクラスかわからない場合以下の書き方でも対応できます Class<?> clazz3 = test.getClass(); |
メソッド情報の取得
クラスの情報の取得があるのなら当然メソッドの情報を取得する方法もあります。
実際にソースを見てみましょう。
ソース
Sample.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
public class Sample { public static void main(String[] args) { try { Sample sp = new Sample(); sp.action(); } catch (Exception e) { System.out.print(e.getMessage()); } } public Sample() { } public void action() throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { //クラスそのものからClassインスタンスを生成 Class<Test> clazz = Test.class; //インスタンスからのクラスインスタンス生成 Test test = new Test(); Class<? extends Test> clazz2 = test.getClass(); //どのクラスかわからない場合以下の書き方でも対応できます Class<?> clazz3 = test.getClass(); //Method invokeで実行を行います。(引数なし) Method method = clazz.getMethod("showMessage"); method.invoke(test); //引数あり Method method2 = clazz.getMethod("showMessage2", String.class); method2.invoke(test, "hoge"); //引数2つ Method method3 = clazz.getMethod("showMessage3", String.class, int.class); method3.invoke(test, "hoge", 3); //一括でメソッドを取得 Method[] methods = Test.class.getMethods(); for (Method m : methods) { System.out.printf("メソッド名:%s \n", m.getName()); Parameter[] param = m.getParameters(); for (Parameter p : param) { System.out.printf("パラメーター: %s \n", p); } } } } |
Test.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class Test { @Getter @Setter private String name; public void showMessage() { System.out.printf("メソッド1 私の名前はhogeです \n"); } public void showMessage2(String inputName) { System.out.printf("メソッド2 私の名前は %sです\n", inputName); } public void showMessage3(String inputName, int number) { System.out.printf("メソッド3 私の名前は %s.No%dです。\n", inputName, number); } } |
実行結果
メソッド1 私の名前はhogeです
メソッド2 私の名前は hogeです
メソッド3 私の名前は hoge.No3です。
メソッド名:getName
メソッド名:setName
パラメーター: java.lang.String arg0
メソッド名:showMessage
メソッド名:showMessage2
パラメーター: java.lang.String arg0
メソッド名:showMessage3
パラメーター: java.lang.String arg0
パラメーター: int arg1
//ここから下はJavaのクラスに標準で実装されているメソッドです
メソッド名:wait
メソッド名:wait
パラメーター: long arg0
パラメーター: int arg1
メソッド名:wait
パラメーター: long arg0
メソッド名:equals
パラメーター: java.lang.Object arg0
メソッド名:toString
メソッド名:hashCode
メソッド名:getClass
メソッド名:notify
メソッド名:notifyAll