山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

スッキリわかるJava入門 実践編 第7章 JVM制御とリフレクション

第7章 JVM制御とリフレクション

外部プログラムの実行

Javaプログラムから他のプログラムを実行したいときは、ProcessBuilderクラスを使って起動させることができます。

TeraPadを起動する

TeraPadを起動し"calcreport.txt"というファイルを作成します。

public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println("計算を開始します。");
        System.out.println("計算を終了しました。TeraPadを起動します。");
        ProcessBuilder pb = new ProcessBuilder(
                "\"C:\\Program Files (x86)\\TeraPad\\TeraPad.exe\"",
                "calcreport.txt"
                );
        pb.start();
    }
}

システムプロパティの利用

システムプロパティを利用することでJavaを実行する環境に依存せずにプログラムを作ることができます。これは、クラスファイルのバイトコードが特定のハードウェアにOSに依存しないため、JVMが動作する環境ならば同じように振る舞うからです。

例えば、改行コードはOSによって異なりますが、システムプロパティを利用して、改行コードを

final String BR = System.getProperty(line.separator);

とすることで、どのOSでも正しく改行を実行することができます。

コンソールにシステムプロパティを出力する

一覧を表示する

import java.util.Iterator;
import java.util.Properties;

public class Main {
    public static void main(String[] args) {
        System.out.println("ご利用のJavaのバージョン");
        System.out.println(System.getProperty("java.version"));
        Properties p = System.getProperties();
        Iterator<String> i = p.stringPropertyNames().iterator();
        /* システムプロパティ
        * JREのバージョン、OSの名前、ユーザの名前など
       */
        System.out.println("[システムプロパティ一覧]");
        while(i.hasNext()) {
            String key = i.next();
            System.out.println(key + " = " + System.getProperty(key));
        }
    }
}

リフレクション

実行時型情報を取得します。型情報はあるクラスにはどのようなメソッドやフィールド変数があるかといった情報です。

リフレクションの用途は、プログラムのテストや解析のためであったり、privateメンバを操作したりしたいときに使われます。例えば、privateなメンバの値を書き換えることができます。その他に、メンバ名を用いた特殊な処理を作るときに使用されます。最後に、利用するクラスを動的に追加・変更できるようにしたいときに使用されます。

Stringクラスの型情報の取得

public class Main {
    public static void main(String[] args) {
        // Stringに関する情報を取得して表示する
        Class<?> info1 = String.class;
        System.out.println(info1.getSimpleName());
        System.out.println(info1.getName());
        System.out.println(info1.getPackage().getName());
    }
}

感想

なんか実践的な内容ですね。僕のプログラムの規模では使うことは多分あまりないと思いますが、こういうような情報があるということを頭にいれておきます。

参考サイト

codezine.jp

スッキリわかる Java入門 実践編 第2版 (スッキリシリーズ)

スッキリわかる Java入門 実践編 第2版 (スッキリシリーズ)