Java リフレクションを使って同じメソッド名があるクラスを指定して実行する

リフレクションは昔、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

MySQL LOAD DATA LOCAL INFILE で特定列を指定してインポートする

郵政事業庁の郵便番号CSVを自分の MySQL のテーブルにインポートすることになり、必要な列だけを選べないかと探してたところ、(今まで MySQL のバルクインサートでは、全列そのまんまインポートしかしたことがなかったので)

CSVの列指定は、 @1, @3, @6 とかで、列位置指定

MySQL は、

SET
JIS_ORG = @1,
ZIP_ORG = @3,
K_NAME = @9,

とかでマッピングします。

LOAD DATA LOCAL INFILE '/????/?????.csv'
INTO TABLE mst_zip
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(@1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13, @14, @15)
SET 
JIS_ORG = @1,
ZIP_ORG = @3,
K_NAME = @9,
H_NAME_ORG = @6,
K_JIS = @8,
H_JIS_ORG = @5
;

ここで教えていただきました : http://jigsaw.hatenablog.jp/entry/2013/06/12/113016

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

3ステップでしっかり学ぶMySQL入門改訂2版 [ 山田祥寛 ]
価格:2728円(税込、送料無料) (2022/12/22時点)