###練習問題の内容
以下のようなLauncherクラスを作るのが練習問題です。(一部省略)
0. 番号リストコマンドライン引数から、次の2つの情報を受けとる。
・第一引数・・・起動すべきクラスのFQCN
・第二引数・・・起動の仕方を示す文字。EまたはI
0. FQCNのクラスが、文字列配列の引数を持つpublicメソッドmain()を持つか調べ、もし持っていれば、コマンドライン第二引数によって次のように起動する。
・Eの場合・・・ProcessBuilderで別プロセスとして起動する
・Iの場合・・・リフレクションでmainメソッドを呼び出す。
0. このプラグラムが終了する際には、軌道に成功した場合は0、そうでなければ1を終了コードとする。
答えのソースコード
java
1import java.lang.reflect.*; 2public class Launcher { 3 public static void main(String[] args) { 4 String fqcn = args[0]; 5 String sw = args[1]; 6 try { 7 Class<?> clazz = Class.forName(fqcn); 8 listMethods(clazz); 9 if(sw.equals("E")) { 10 launchExternal(clazz); 11 } else if(sw.equals("I")) { 12 launchInternal(clazz); 13 } else { 14 throw new IllegalArgumentException("起動方法の指定が不正です."); 15 } 16 } catch(Exception e) { 17 System.out.println(e.getMessage()); 18 e.printStackTrace(); 19 System.exit(1); 20 } 21 System.exit(0); 22 } 23 24 public static void listMethods(Class<?> clazz) { 25 System.out.println("メソッドの一覧を表示します."); 26 Method[] methods = clazz.getDeclaredMethods(); 27 for(Method m : methods) { 28 System.out.println(m.getName()); 29 } 30 } 31 32 public static void launchExternal(Class<?> clazz) throws Exception { 33 ProcessBuilder pb = new ProcessBuilder("java", clazz.getName()); 34 Process proc = pb.start(); 35 proc.waitFor(); // プロセスの終了まで待つ 36 } 37 38 public static void launchInternal(Class<?> clazz) throws Exception { 39 Method m = clazz.getMethod("main", String[].class); 40 String[] args = {}; 41 m.invoke(null, (Object)args); // 静的メソッド呼び出し時は第一引数は任意 42 } 43}
疑問点
見出しの「練習問題の内容」の太字になっているところ。答えのソースコードのif文のあたりがその該当箇所であると思うのですが、答えのソースコードでは起動の仕方を指定しないときの対処だけしか書けていない気がします。起動したいクラスが文字列配列の引数を持つpubicメソッドmain()を持つを調べるif文が抜けていませんか。。?
まとめ
どこかにmain()を調べているコードがあれば、ぜひ教えていただきたいです。javaはまだまだですが、どうぞよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー