これのときのあれこれ
snack.elve.club
名前(文字列)でメソッドをコールしたいぞ、と。
google:文字列で関数をコール java
多分なんかリフレクションって機能っぽいぞ、と。
みてると宣伝出てくるタイプの技術サイト死スべし(´;ω;`)
www.sejuku.net
そんなわけでこちらをベースにしたわけですが
iwakwak.hatenablog.com
これが今は非推奨になったとかで実行時にエラーになっちゃう
Java:リフレクションの使い方 - そふと工房
Object object = clazz.newInstance();
解決方法としては
Class.newInstance()は非推奨
clazz.getDeclaredConstructor(null).newInstance(null);
Classクラス直接ではなくてどのコンストラクタを呼ぶのかを指定すると警告は出ないようです。
で、冒頭記事のソースだったのですが、なんか気持ち悪い。
インスタンスもコンストラクタもよくわからない(クラス概念苦手)だが、とにかくなんか引っかかっておりました。
- メイン処理と各処理を別のクラスにして別ファイルに保存したけど、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を引数にコールされました。
となります。
参考
Java リフレクションのサンプル | ITSakura
Java:リフレクションの使い方 - そふと工房
Java リフレクションの Class オブジェクトからのインスタンスの作成 - Java のリフレクション - Java の基本 - Java 入門
Java リフレクションでメソッド実行 - Qiita
Java リフレクションで関数をまとめて呼び出す方法 - Qiita
入門Javaのリフレクション - Qiita
Javaのリフレクションの使い方を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン
【Java入門】リフレクションでメソッドの実行、フィールドの変更 | 侍エンジニアブログ