リフレクションは昔、JDBCのドライバーを使う時、データベース別にクラスを違える為、class.forName() を使ったくらいで、その便利さが活用できぬままでしたが、同じメソッド名で異なる処理してるクラスを選んでインスタンス化 => メソッド実行とかできると楽で便利なので、ちょっと調べて実装してみました。
< コード例 >
package mapaddress;
import java.util.ArrayList;
import java.io.File;
import java.io.*;
import java.util.*;
import java.lang.reflect.Method;
import java.lang.reflect.Executable;
import java.lang.reflect.AccessibleObject;
public class MapAddress {
public static void main(String[] args) {
// 引数がない場合、すぐ終わらす //
if (args.length == 0) {
System.out.println("no argument");
return;
}
// このクラスのパッケージ名 //
String packageName = MapAddress.class.getPackage().getName();
System.out.println(packageName);
// 引数はクラス名の1個 //
String nmClass = args[0];
System.out.println(args[0]);
MapAddress MA = new MapAddress();
try {
// クラスオブジェクト取得 //
Class<?> c = Class.forName(packageName + "." + nmClass);
// インスタンス化 //
Object objc = c.newInstance();
// 第一メソッド実行 //
Method method = c.getMethod("getAddressPage");
method.invoke(objc);
// 第ニメソッド実行 //
if (MA.is2methodMap.get(nmClass)) {
method = c.getMethod("addStoreDetails");
method.invoke(objc);
}
// 生成されたリストをデバッグ //
method = c.getMethod("getStoreDtlList");
System.out.println(method.invoke(objc));
// ???????? なので各クラスのメソッドにする //
//ArrayList<HashMap<String, String>> dtllist = method.invoke(objc);
// 引数がある場合は、getMethodで定義しておく //
method = c.getMethod("execUpdateTable", String.class, String.class);
method.invoke(objc, MA.listnameMap.get(nmClass), iconfnm);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
ここらで教えて頂く :
https://www.sejuku.net/blog/33252
https://itsakura.com/java-reflect
http://pppurple.hatenablog.com/entry/2016/07/23/205446
https://www.logicbig.com/how-to/code-snippets/jcode-reflection-class-getmethod.html