2012年9月28日金曜日

Java: クラスが持っているフィールドやメソッド名を検索し,動的に実行する

ちょっとマニアックなネタです。ラボでO/Rマッパーみたいなものを作ろうとしているのですが、その際に使えそうなノウハウを紹介します。

クラスのフィールド名とメソッド名を検索する
あるクラスがどういうフィールドやメソッドをもっているか?を調べるには下記のようにします
Class c = Class.forName("クラス名");
Field[] fields = c.getFields(); //フィールド名
Method[] methods = c.getMethods(); //メソッド名
String methodName = method[0].getName();
これらのメソッドはフィールドインスタンスやメソッドインスタンスを入手するものなので、特定のメソッド名(またはフィールド名)を取ってくることも可能です。その場合は、下記のように記述します。
Method method = c.getMethod(メソッド名, 引数の型<可変長>);
なお、getMethodsやgetFieldsではパグリックなフィールドやメソッドしか入手できませんが、getDeclaredMethodsやgetDeclaredFieldsを利用するとプライベートなフィールドやメソッドを入手することが可能です。

メソッドを実行する 
上記のmethodsはメソッドインスタンスの配列です。これを利用して下記のように検索したメソッドを実行します。下記では,実行対象となるインスタンスを生成してメソッドをinvokeする際に渡してます。staticなメソッドの場合は不要です(第一引数はnullです)。
Constructor constructor = c.getConstructor(new Class[] {});
Object o = constructor.newInstance(new Object[] {});
methods[i].invoke(o, null);

フィールドにアクセスする
 上記で入手したフィールドにアクセスする方法は下記の通りです。
fields[0].set(obj, "abc");
String n = (String)fields[0].get(obj);
O/Rマッパーを自作するときは,プライベートなフィールド名を利用するとよいかもしれません。

0 件のコメント:

コメントを投稿