スッキリjavaの練習問題です。配列の非常にシンプルなエラーなのですが(画像左下)コードが長くなると、どこを修正すればよいのかがわかりません。実践編になって難易度がグッと上がり挫折しそうになりながらも進めています。最後にある2通りの起動を試す方法もイマイチわかりません。少々長いですがどうか助けてくださいお願いします。
クラスの条件:
1.コマンドライン引数から、次の2つの情報を受け取る
・第一引数…起動すべきクラスのFQCN
・第二引数…起動仕方を示す文字。EまたはI
2.現在のメモリ使用量を表示する
3.FQCNのクラスが持つ、すべてのメソッド名を画面に表示する
4.FQCNのクラスが、文字列配列の引数を持つpublicメソッドmain()を持つか調べ、もし持っていれば、コマンドライン第二引数によって次のように起動する。
・Eの場合…ProcessBuilderで別プロセスとして起動する
・Iの場合…リフレクションでmainメソッドを呼び出す
5.現在のメモリ使用量(MB単位)を表示する
6.このプログラムが終了する際には、起動に成功した場合は0、そうでなければ1を終了コードとする。
また、起動すると要素数1280000のlong型配列を確保するだけの処理を行うプログラムMemoryEaterを作成し、Launcherで2通りの起動を試してください。
import java.lang.reflect.Method; public class Launcher { public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ System.out.println("eating memory..."); long[] larray = new long[1280000]; for(int i = 0;i<larray.length;i++) { larray[i] = i; } //コマンドライン引数(main関数に渡す引数)//argsは文字列配列として扱われる String fqcn = args[0]; //条件①起動すべきクラスのFQCN(完全限定クラス) String sw = args[1]; //起動仕方を示す文字EまたはI showMemory(); try { Class<?> clazz = Class.forName(fqcn);//クラスインスタンスを取得 listMethods(clazz); if(sw.equals("E")) { launchExternal(clazz); //"E"の場合ProcessBuilderで別プロセスとして起動する }else if(sw.equals("I")) { //定義は後ろ launchInternal(clazz); //"I"の場合リフレクションでmainメソッドを呼び出す //定義は後ろ }else { //EとI以外はエラーを投げる throw new IllegalArgumentException("起動方法の指定が不正です"); } }catch(Exception e) { //EとIでのエラー発生時 System.out.println(e.getMessage()); e.printStackTrace(); System.exit(1); //0以外は異常終了 } showMemory(); System.exit(0); } //③すべてのメソッド名を画面に表示する public static void listMethods(Class<?> clazz) { System.out.println("メソッドの一覧を表示します"); Method[] methods = clazz.getDeclaredMethods();//Methodオブジェクトが格納された配列を返す for(Method m : methods) { System.out.println(m.getName()); //Methodの名前をStringとして返す } } //launch external(外部起動)メソッドの実装 public static void launchExternal(Class<?> clazz) throws Exception{ ProcessBuilder pb = new ProcessBuilder("java",clazz.getName()); Process proc = pb.start(); proc.waitFor();//プロセス終了まで現在のスレッドを待機させる } //launchInternal(内部起動)メソッドの実装 public static void launchInternal(Class<?> clazz) throws Exception{ Method m = clazz.getMethod("main", String[].class); String[] args = {}; m.invoke(null, (Object)args);//静的メソッド呼出し時は第一引数は何を指定しても良い //Object..可変長引数に配列を渡す場合はObject型へのキャストが必要 } //現在のメモリ使用量を表示するshowMemory()の実装 public static void showMemory() { long free = Runtime.getRuntime().freeMemory();// long total = Runtime.getRuntime().totalMemory(); long usage = (total - free)/1024/1024; //MBへ変換 System.out.println("現在のメモリ使用量:" + usage + "MB"); } }
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。