スナックelve 本店

バツイチ40代女の日記です

何をしてるのかわからないよ!!!

これのときのあれこれ
snack.elve.club

名前(文字列)でメソッドをコールしたいぞ、と。
google:文字列で関数をコール java

多分なんかリフレクションって機能っぽいぞ、と。
みてると宣伝出てくるタイプの技術サイト死スべし(´;ω;`)
www.sejuku.net

そんなわけでこちらをベースにしたわけですが
iwakwak.hatenablog.com

これが今は非推奨になったとかで実行時にエラーになっちゃう

Object object = clazz.newInstance();

Java:リフレクションの使い方 - そふと工房

解決方法としては

clazz.getDeclaredConstructor(null).newInstance(null);
Classクラス直接ではなくてどのコンストラクタを呼ぶのかを指定すると警告は出ないようです。

Class.newInstance()は非推奨

で、冒頭記事のソースだったのですが、なんか気持ち悪い。
インスタンスもコンストラクタもよくわからない(クラス概念苦手)だが、とにかくなんか引っかかっておりました。

  • メイン処理と各処理を別のクラスにして別ファイルに保存したけど、1つでいいんじゃね?
  • Class<?>ってなんかキモくね? 普通にクラス作ってどうにかなるんじゃね?

で、ずーっと気になっていてテストクラス作成しました

//これがないとInvocationTargetException例外をキャッチできない
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class testMain {
    testMain() {
        //コンストラクタ
        System.out.println("testMainが作られました。");
        return;
    }

    public void testPrint1(String str) {
        //渡されたパラメータ表示するテスト関数
        System.out.println("testPrint1が" + str + "を引数にコールされました。");
        return;
    }

    public static void main(String args[]) {
        //普通にクラス生成
        testMain c = new testMain();
        //通常コール
        c.testPrint1("最初のコール");
        //オブジェクト型にクラスを入れておく
        Object obj = c;
        try {
            //ポイント:try~がないとエラーが出る
            Method m = c.getClass().getMethod("testPrint1", String.class);
            m.invoke(obj, "TEST");
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

これ実行で出力は

testMainが作られました。
testPrint1が最初のコールを引数にコールされました。
testPrint1がTESTを引数にコールされました。

となります。