[Ava]基本APIクラス③


[システムクラス]


Javaプログラムはオペレーティングシステム上で直接実行されるのではなく、JVM上で実行されるため、Javaコードでオペレーティングシステムのすべての機能に直接アクセスすることは難しい.ただし、java.langpackageのSystemクラスを使用すると、オペレーティングシステムのいくつかの機能を使用できます.
Ex)プログラムの終了、キーボードからの入力、ディスプレイへの出力、メモリのクリーンアップ、現在時刻の読み出し、システムプロファイルの読み出し、環境変数の読み出しなどSystemクラス内のすべてのフィールドおよびメソッドは、静的(static)フィールドおよび静的メソッドから構成される.

1.プログラムを終了する(exit()

exit()メソッドは、現在実行中のプロセスを強制的に終了させることができる.exit()メソッドでは、終了状態値と呼ばれるintパラメータ値を指定する必要があります.
一般に、正常終了時は0、非正常終了時は0 이외의 다른 값が与えられる.
System.exit(0);

2.ゴミ収集器の運転(gc()


Javaは、開発者が直接コードでメモリを管理するのではなく、JVMによって自動的に管理されます.JVMはメモリ不足とCPUアイドル時にゴミ収集器Garbage Collectorを実行し、未使用のオブジェクトを自動的にクリアする.new演算子Carを使用してオブジェクトを作成し、変数myCarにオブジェクト番号を代入するとします.
Car myCar = new Car();

変数myCarnullが代入された場合、myCarはオブジェクトの番号を失います.オブジェクトの番号が分からないため、Carオブジェクトは使用できなくなり、ゴミになります.
myCar = null;

変数myCarが別のCarオブジェクトを参照すると、前のオブジェクトの番号が失われるため、前のオブジェクトもゴミになります.
Car myCar = new Car();	//이전 참조 객체
myCar = new Car();	//현재 참조 객체

ごみ収集器は開発者が直接コードで実行することができなくて、System.gc()方法を通じてJVMにできるだけ早く実行するように要求することができますSystem.gc()メソッドを呼び出すと、ゴミ収集器はすぐには実行されず、JVMは最短時間で実行しようと努力します.
System.gc();
ごみが発生するたびに、ごみ収集器が起動すると、実行するプログラムの速度が低下するため、性能面ではあまりよくありません.また、メモリが十分であれば、ゴミ収集器を実行する必要はありません.したがって,gc()メソッドはメモリが悪くない環境ではほとんど使用する必要がない.
ゴミ収集器は、オブジェクトを削除する前に、最後にオブジェクトの消滅者を実行します.

3.現在の読み込み(CurrentTimeMillis()、nanoTime()

SystemクラスのcurrentTimeMillis()メソッドとnanoTime()メソッド.
現在時刻밀리세컨드(1/1000초) 단위および나노세컨드(1/10^9)초 단위long値をコンピュータ上のクロックから読み出す.
long time = System.currentTimeMillis();
long time = System.nanoTime();
戻り値は、主にプログラムの実行に要する時間を測定するために使用されます.

4.システムプロファイルの読み込み(getProperty()


システム構成(System Property)とは、JVM起動時に自動的に設定されるシステム属性値のことです.
Ex)オペレーティングシステムのタイプや、Javaプログラムを実行するユーザID、JVMのバージョン、オペレーティングシステムで使用するファイルパス区切り記号など.
システムプロファイルは、鍵(key)と値(value)から構成されます.代表的なキーと値の説明は次のとおりです.
System.getProperty()メソッドを使用して、システムプロファイルを取得します.このメソッドは、システムプロファイルの鍵名をパラメータとして受け入れ、鍵の値を文字列に返します.
String value = System.getProperty(String key);
+)System.getProperties()メソッドは、(키, 값)ペアをすべて格納したPropertiesオブジェクトを返します.
このオブジェクトを呼び出すkeySet()メソッドは、キーのみからなるSetオブジェクトを得ることができる.

[クラス]


Javaはクラスとインタフェースのメタデータをjava.langパケットが属するClassクラスとして管理する.
✅メタデータ:クラス名、作成者情報、フィールド情報、メソッド情報

1.クラスオブジェクトの取得(getClass()、forName()


プログラムからClassオブジェクトを取得するには、Objectクラスが持つgetClass()メソッドを使用します.
Class clazz = obj.getClass();
getClass()メソッドは、クラスを使用してオブジェクトを作成する場合にのみ使用できます.また、オブジェクトを作成する前にClassオブジェクトを直接取得することもできます.Classはジェネレータを非表示にするため、new演算子を使用してオブジェクトを作成することはできません.静的メソッドforName()を使用する必要があります.forName()メソッドは、클래스 전체 이름(패키지가 포함된 이름)をメディア値として受け入れ、Classオブジェクトを返します.
try {
    Class clazz = Class.forName(String className);
} catch (ClassNotFoundExcetion e) {
}
Class.forName()メソッドは、各値として指定されたクラスが見つからない場合、ClassNotFoundException異常を引き起こすため、異常処理が必要となる.

2.返信(getDeclaredConstructor)、getDeclaredFields()、getDeclaredMethods()


返信(Reflection)とは、Classオブジェクトを用いてクラスを理解する情報(ジェネレータ、フィールド、メソッド)を指す.Class対象は、返信提供getDeclaredConstructors()getDeclaredFields()getDeclaredMethods().
Constructor[] constructors = clazz.getDeclaredConstructors();
Field [] fields = clazz.getDeclaredFields();
Method[] methods = clazz.getDeclaredMethods();
メソッド名から分かるように、3つのメソッドは、Contstructor配列、Field配列、およびMethod配列をそれぞれ返す.
  • ContstructorFieldMethodクラスはいずれもjava.lang.reflectパッケージに属する.
  • getDeclaredFields()getDeclaredMethods()クラスに宣言されたメンバーのみがインポートされ、継承されたメンバーはインポートされません.
  • 継承メンバーを取得する場合は、getFields()getMethods()を使用する必要があります.
  • ただし、getFields()getMethods()publicメンバーのみをインポートします.
  • 3.動的オブジェクトの作成(newInstance()

    Classオブジェクトを使用すると、new演算子を使用せずにオブジェクトを動的に作成できます.この方法は、コードの作成時にクラス名を特定できず、実行時にクラス名を決定できない場合に便利です.Class.forName()メソッドClassオブジェクトを次のコードで取得し、newInstance()メソッドを呼び出すと、Objectタイプのオブジェクトが取得されます.
    try {
        Class clazz = Class.forName("런타임 시 결정되는 클래스 이름");
        Object obj = clazz.newInstance();
    } catch (ClassNotFoundException e) {
    } catch (InstantiationException e) {
    } catch (IllegalAccessException e) {
    }
    newInstance()メソッドは、デフォルトジェネレータを呼び出してオブジェクトを作成するため、クラスにデフォルトジェネレータが存在する必要があります.パラメータ付きジェネレータを呼び出すには、replicationでConstructorオブジェクトを取得し、newInstance()メソッドを呼び出すだけです.newInstance()メソッドでは2つの例外が発生する可能性があるため、例外処理コードを使用する必要があります.
  • InstantiationException例外:クラスが抽象クラスまたはインタフェースである場合に励起
  • IllegalAccessException例外:クラスまたは作成者がアクセス制限によってアクセスできない場合
  • newInstance()メソッドの戻りタイプはObjectであり、このメソッドを使用するにはクラスタイプに変換する必要があります.このため、強制タイプ変換を行う必要がありますが、クラスタイプが分からないため、変換はできません.この問題を解決するには、インタフェースを使用する必要があります.


    例えば、Actionインタフェースおよび実装クラスSendActionReceiveActionがあると仮定する.

    |メソッドの各値として"SendAction"または"ReceiveAction"を使用して、Class.forName()オブジェクトを作成し、ClassオブジェクトのClassメソッドを使用してnewInstance()オブジェクトを取得します.取得されたすべてのオブジェクトはObjectinterfaceを実装するため、Actiooninterfaceタイプに変換できます.次に、ActionインタフェースのActionメソッドが呼び出され、単一クラスのエンティティメソッドexecute()メソッドが実行される.
    Class clazz = Class.forName("SendAction" 또는 "ReceiveAction");
    Action action = (Action) clazz.newInstance();
    action.execute();	//SendAction 또는 ReceiveAction의 execute()가 실행됨
    execute()「SendAction」文字列がメソッドのパラメータとして与えられた場合、Class.forName()クラスのSendActionメソッドが呼び出され、「ReceiveAction」文字列がパラメータとして与えられた場合、execute()クラスのReceiveActionメソッドが呼び出される.

    [参考資料]


    これはジャワの本です.