質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

2069閲覧

JavaのSystem.getProperties()メソッドについて

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/08/10 02:42

JavaのSystem.getProperties()メソッドについての質問です。

このメソッドは返り値の型はPropertiesで、インスタンスが帰ってくるようです。
APIレファレンスを見ますと、次のようなコードでした。
(Java.lang.Systemクラスです。)

private static Properties props; public static Properties getProperties() { SecurityManager sm = getSecurityManager(); if (sm != null) { sm.checkPropertiesAccess(); } return props; }

インスタンスが返ってくるから、

public static Properties getProperties() { Properties p = new Properties(); return p; }

のようなコードかと思ったのですが、newによるインスタンス生成は行われていないようです。
そうすると、参照を返しているということになると思うのですが、どこでnewされているのでしょうか。
ご存知の方いらっしゃいましたら、回答お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ソースコード全体を見ると分かりますが、initializeSystemClass()メソッドで初期化しています。
Systemクラスは特別なクラスで、VMの初期化処理の中でinitializeSystemClass()メソッドが呼ばれてクラスの初期化が行われます。
さらに具体的には、その中でNativeメソッドinitProperties(props)を読んでpropsを初期化しています。

java.lang.System (.java L.1155) - GrepCode Class Source
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/lang/System.java/#1155

IDEなどで、ソースコードを参照できる環境があれば、そちらで確認していただいてもOKです。

投稿2016/08/10 02:53

編集2016/08/10 12:49
argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/08/10 12:32

getPropertiesメソッドの中では初期化は行われていないですよね? それできちんとインスタンスが帰ってくるのはなぜでしょうか。 すなわち、いつその初期化が行われるのでしょうか。
argius

2016/08/10 12:43

Systemクラスは特別なクラスで、VMの初期化処理の中でinitializeSystemClass()メソッドが呼ばれてクラスの初期化が行われます。 よって、ユーザーのプログラムでgetPropertiesを呼んだ時には、既にpropsの中身は準備された状態になります。
argius

2016/08/10 12:50

初期化タイミングの件を本文に追記しておきました。
退会済みユーザー

退会済みユーザー

2016/08/11 11:15

はい、回答ありがとうございます。 私もそのコードを読んだので、何がどうなっているのかということは理解できたました。 JVMの初期化処理の中で初期化が行われるとのことですが、それはSystemクラスが読み込まれた時に行われるのでしょうか。
argius

2016/08/11 11:23

> JVMの初期化処理の中で初期化が行われるとのことですが、それはSystemクラスが読み込まれた時に行われるのでしょうか。 JVMの初期化処理というのは、Javaに入る前のネイティブプログラム(C++で書かれている部分)で行われる処理のことです。 具体的には下記です。(OpenJDK7のソースコードです) https://github.com/openjdk-mirror/jdk7u-hotspot/blob/master/src/share/vm/runtime/thread.cpp#L3354
退会済みユーザー

退会済みユーザー

2016/08/12 14:42

「Javaに入る前」というのはいつなのでしょうか。 JVMがOSに読み込まれる時という意味でしょうか。
argius

2016/08/12 15:51

私もここのすべての処理を覚えているわけではないですし正確かどうかはあまり自信ないのでざっくりですが、だいたいこんな感じです。 javaコマンド実行 ↓ JavaVM生成 この中で、thread.cppのThreads::create_vm()が呼ばれる ↓ JavaVM初期化 ↓ JavaMain実行 この中で、Javaのメインメソッドが実行される 初期化処理については、このページが分かりやすいかと。 HotSpot の起動/終了処理 : HotSpot の起動処理の流れ (JNI_CreateJavaVM() の処理の流れ) http://hsmemo.github.io/articles/no2114J7x.html この記事の中の JNI_CreateJavaVM() → Threads::create_vm()の中の、 > 種々の Java クラスがロードされ初期化される. のうち、Systemクラスは前述したthread.cpp#L3354のところで行われています。
退会済みユーザー

退会済みユーザー

2016/08/13 14:52

詳しい回答ありがとうございました。
guest

0

シングルトンと呼ばれる実装パターンでしょう。

複数のインスタンスを作られたくない場合にこのような実装にすることがあります。
ちょっと古いバージョンですが(Java 6)、以下のページで初期化の部分が見られます。

GC: System - java.lang.System (.java) - GrepCode Class Source

Java

1 2private static void initializeSystemClass() { 3 props = new Properties();

Systemのプロパティ値は、値がそれぞれひとつしかないので、
複数のインスタンスを持つ必要がないからと考えられますね。

投稿2016/08/10 03:03

Mr_Roboto

総合スコア2208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/08/10 12:32

getPropertiesメソッドの中では初期化は行われていないですよね? それできちんとインスタンスが帰ってくるのはなぜでしょうか。 すなわち、いつその初期化が行われるのでしょうか。
Mr_Roboto

2016/08/10 12:43

argiusさんの回答にも私の回答にもinitializeSystemClassメソッドで 初期化していますと書いていますが、どこが理解できないのでしょう? 別にそのメソッドの中で初期化しないといけないときまっているわけではないですよ?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問