はじめに
こんにちは ◤●ㅅ●◥ノ
今回はJVM自体の制御に関わるAPIについて学びました!
第4章 JVM制御とリフレクション
1.JVM自体の制御
そもそもJVMとは...?
Java Virtual Machineの略で、Javaのプログラムを動かすために必要なソフトウェアのこと
Javaには開発者がJVM自体の内部機構にアクセスして情報を得たり、
直接制御するためのAPIが存在する
JVM自体を制御するAPIについて学んでいく
2.JVMの終了
System.exit()を呼ぶとその場でプログラムを終了する
System.exitにはint型の引数を与えることができ、その数値が終了コードとしてOSに報告される
→多くのOSでは0は正常終了、0以外は異常終了を意味する
どのように使うのか
エラーの原因ごとに異なる終了コードを返してプログラムを終了するようにする
→バッチ処理が異常終了した場合の原因究明に使うことができる
3.外部プログラムの実行
java.lang.ProcessBuilderクラスを利用する
→自分が開発しているJavaプログラムから他のプログラムを起動できる
4.システムプロパティの利用
JVMは、プログラム起動直後に地震やOSに関する情報を自動的に収集し、
システムプロパティとして保持する
システムプロパティはキーと値のペアとなっている
※システムプロパティとは...
JVMに関する情報のこと「属性」だったり「特性」などのある対象物の特徴に関する情報を表す
システムプロパティはどのようなクラスからも直接読み書きできるため便利
ただ、不具合の原因にもなりやすいため乱用は禁物
5.ロケールと国際化
JVMがOSからどのような「場所」でどのような「言語」を使うユーザーを前提として動作するかという情報を受けとっている
この情報は様々な局面で利用するために動作中はJVMが保持し続ける
これらの情報を総称して ロケール と呼ばれ、java.util.Localeクラスを通して参照や変更される
またJVMは「時間帯」も管理しており、これをタイムゾーンと呼び、プログラムが動作している
PCの置かれた地域で使われている標準時と世界標準時との時差で表される
タイムゾーンはjava.util.TimeZoneクラスを用いて操作する
ロケールやタイムゾーンなどの情報はアプリケーションの国際化の基盤として重要な要素になる
SNSや貿易に関するシステムなどの世界各国から同時に利用されるシステムの構築には欠かせない技術
6.メモリに関する状態の取得
JVMのメモリ状態の取得にはjava.lang.RuntimeクラスのgetRuntime()を呼び出し、Runtimeインスタンスを取得する必要がある
7.リフレクション
リフレクションAPI
クラスやインタフェースに関するさまざまな型情報の調査をJVMに依頼することができる
リフレクションAPIを用いて、クラスやメンバに対してどのような修飾がされているかを調べることができる
Classインスタンスの基本的な取得方法
1.Class<?> cinfo = Class.forName(FQCN文字列);
2.Class<?> cinfo = クラス名.class;
3.Class<?> cinfo = 変数名.getClass();
これらはjava.lang.Classクラスのインスタンスを戻り値として返す
まとめ
System.exit()を呼ぶとその場でプログラムを終了する、OSに終了コードを返す
java.lang.ProcessBuilderクラスを利用することで外部プログラムを起動できる
タイムゾーンはjava.util.TimeZoneクラスを用いて操作する
リフレクションではClassクラスを用いて、型に関するさまざまな情報を取得できる