Java Platform, Standard Edition

**Java Platform, Standard Edition** または **Java SE** は、多くのJavaプラットフォームプログラムで利用されるJava APIの集合体である。Java仮想マシン、APIなどから構成される。バージョン1.2からバージョン5.0まではJava 2 Platform, Standard EditionまたはJ2SEと呼ばれていた（詳細はJavaバージョン履歴を参照）。

J2SEバージョン1.4 (Merlin) 以降、Java SEプラットフォームはJava Community Process (JCP) の下で開発されている。JSR 59はJ2SE 1.4の包括仕様であり、JSR 176はJ2SE 5.0 (Tiger) を、JSR 270はJava SE 6 (Mustang) を規定している。Java SE 7 (Dolphin) はJSR 336の下でリリースされた。

Java SEでは標準的な機能のみが定められており、サーバ関連の機能については、Java 2から8まではJava SEを拡張した企業向けのエディションであるJava Platform, Enterprise Edition (Java EE) にて定義されていた。Java 9以降は、上位互換というわけでは無いが、Eclipse FoundationがJakarta EEとして引き継いでいる。

## java.baseモジュールのパッケージ
下記は主要なJava SEパッケージの説明である。全てのパッケージリストはを参照。

### 
Javaの基本的なパッケージ。

パッケージ `java.lang` は、言語とランタイム（実行）システムに緊密な基本的なクラスとインタフェースを含む。これはクラス階層を形成する基底クラス、言語仕様に密接な型、基本的な例外、数学関数、スレッド、セキュリティ関数、下位にあるネイティブシステムに関する情報も含む。

`java.lang`の主なクラス:
*  – 全てのクラス階層の頂点に立つクラス。関連項目として、Javaの文法#Objectクラスのメソッドを参照。
*  – 列挙クラスの基本クラス (J2SE 5.0以降)。
*  – Javaの型情報の根幹となるクラス。特にリフレクションシステムで重要な役割を果たす。
*  – 例外クラス階層の基底クラスとなるクラス。
* , ,  – 各例外型の基底クラス。`RuntimeException`はthrowやthrows宣言をせずとも実行時に起こる例外を指すクラスのスーパークラスであり、`Exception`のサブクラスでもある。`Exception`、`Error`は`Throwable`のサブクラス。
*  – 薄く抽象化されたスレッドの操作を提供するクラス。
*  – 文字列と文字列リテラルを表現するクラス。
* ,  – 文字列操作機能を提供するクラス。`StringBuilder`はJ2SE 5.0以降。
*  – 総称的な比較とオブジェクトの大小関係を判定することができるインタフェース (J2SE 1.2以降)。
*  – 総称的な反復子とで拡張<code>for</code>ループを使用可能にするインタフェース (J2SE 5.0以降)。
* , , , ,  – クラスの動的ロード、外部プロセスの生成、時刻などを問い合わせるホスト環境、情報セキュリティポリシーの執行などを管理する「システムオペレーション」を提供するクラス。
* ,  – `sin` (正弦)、`cos` (余弦)、`sqrt` (平方根) などの数学関数を提供するクラス。実行環境に依存しない演算結果を保証する`StrictMath`はJ2SE 1.3以降。
* プリミティブ型をオブジェクトとしてカプセル化するためのプリミティブラッパークラス。
* 言語レベルもしくは他の共通例外としてスローされる例外基底クラス。

`java.lang`のクラスはソースファイルでimport宣言をせずとも自動的にインポートされる。

#### 
`java.lang.ref`パッケージは、他の可能な許可するアプリケーションとJava仮想マシン (JVM) ガベージコレクタとの間の限定的な相互関係よりも柔軟な参照型を提供する。それは重要なパッケージであり、それに"java.lang"で始まる名前を与えた言語設計者のための言語として十分に中核をなしたが、それはいくぶん特殊目的であり多くの開発者は使わない。このパッケージはJ2SE1.2から追加された。

Javaは多くのガベージコレクトされたプログラミング言語より柔軟な参照システムを持ち、ガベージコレクションに特別な振る舞いを許可する。Javaにある通常の（言語組み込みの）参照は「強参照 ()」として知られている。`java.lang.ref`パッケージは3つの弱い参照型（**ソフト参照**`SoftReference`、**弱参照**`WeakReference`、**ファントム参照**`PhantomReference`）を定義している。各々の参照型は特殊な用途のために設計されている。

***' は[[キャッシュ (コンピュータシステム)|キャッシュ]]を実装するために使われている。オブジェクトは強到達可能 () つまり強参照によって到達可能ではないが、ソフト到達可能 () と呼ばれるソフト参照によって参照されている。ソフト到達可能なオブジェクトはガベージコレクタの自由裁量によってガベージコレクトされるかもしれない。これは一般的にソフト到達可能なオブジェクトは空きメモリが少ないときのみガベージコレクトされるだろうということを意味する。ところが、それはガベージコレクタの自由裁量にある。意味的に言えば、ソフト参照は「メモリが必要とされなくなるまでこのオブジェクトを保持せよ」ということを意味する。

***' は弱マップを実装するために使われている。強到達可能またはソフト到達可能でなく弱参照によって参照されているオブジェクトは、弱到達可能 () と呼ばれる。弱到達可能なオブジェクトは次の回収サイクルの間にガベージコレクトされる。この振る舞いはクラスによって使われている。プログラマは弱マップにキー/値ペアを挿入でき、キーがどこからも到達可能でなくなるかどうかを心配する必要がなく、オブジェクトがメモリを占有する可能性を心配しなくてよい。意味的に言えば、弱参照は「他にそれを参照するものが無いときはこのオブジェクトを除去せよ」を意味する。

**** はガベージコレクションにマークされているオブジェクトを参照するために使われており、ファイナライズされているが、未だに再利用されていない。オブジェクトは強、ソフト、弱到達可能でないが、ファントム到達可能 () と呼ばれるファントム参照によって参照されている。これはファイナライゼーションメカニズムのみによって可能なものよりもより柔軟なクリーンナップを可能にする。意味的に言えば、ファントム参照は「このオブジェクトは長い間必要とされなくなりコレクトされる準備をしている状態でファイナライズされている。」を意味する。

これらの各々の参照型はクラスを継承し、リファレント（指示対象オブジェクト）（または、もし参照がクリアされているか参照型がファントムであるならば`null`）への強参照を返すメソッド および、リファレンスをクリアするメソッドを提供する。

`java.lang.ref` もまた参照型が変わるオブジェクトを保持するために上記で検討された各々のアプリケーションが使われるクラスを定義する。
`Reference`が生成されるとき、それは任意にリファレンスキューに登録される。アプリケーションは到達可能性状態の変化した参照を得るためのリファレンスキューを監視する。

参照型とリファレンスキューのより首尾よい説明は*"[https://java.sun.com/developer/technicalArticles/ALT/RefObj/index.html Reference Objects and Garbage Collection]"* を参照。

#### 
リフレクションはJavaコード調査や、実行時のJavaコンポーネントやリフレクトされたメンバを使用する上での「リフレクト」を可能にするJava APIの構成要素である。このパッケージにあるクラスは、`java.lang.Class`とに加えて、デバッガやインタプリタ、オブジェクトインスペクタ（調査）、クラスブラウザのようなアプリケーション、オブジェクトシリアライゼーションやJavaBeansのようなサービスに適合し、（その実行クラスを基礎とする）ターゲットとなるオブジェクトのpublicメンバまたは与えられたクラスによって宣言されたメンバにアクセスする必要がある。このパッケージはJDK1.1より追加された。

リフレクションはインスタンスによって使われ、それらの名前を使ってメソッドを呼び出す、動的プログラミングを許可する着想である。クラス、インタフェース、メソッド、フィールド、コンストラクタはすべて実行時に見つけて利用することができる。メタデータによってサポートされているリフレクションはそのプログラムの近くにあるJVMである。そこにはリフレクションによって呼び出された二つの技術がある。

# *Discovery* はオブジェクトやクラスの取得に関わり、メンバ、スーパークラス、実装されたインタフェースとそのとき発見された要素を使う可能性の発見に関わる。
# *Use by name* は要素のシンボル名呼び出し始めて、名付けられた要素を使用する。

##### Discovery
Discoveryはだいたいオブジェクトから始まり、`Class`のオブジェクトを取得するメソッドを呼び出す。`Class`オブジェクトはクラスの中身を発見する数種のメソッドを持つ。以下にその例を示す:
*  – クラスまたはインタフェースのpublicメソッドすべてをオブジェクトの配列として返す。
*  – クラスのpublicコンストラクタすべてをの配列として返す。
*  – クラスまたはインタフェースのpublicフィールドすべてをオブジェクトの配列として返す。
*  – クラスまたはインタフェースのメンバ(e.g. 内部クラス)としてのpublicなクラスまたはインタフェースすべてを`Class`の配列として返す。
*  – クラスまたはインタフェースのスーパークラスを`Class`オブジェクトを返す。インタフェースの場合は常に`null`を返す。
*  – クラスまたはインタフェースによって実装されているすべてのインタフェースを`Class`オブジェクトの配列として返す。

##### Use by name
`Class`オブジェクトは「クラスリテラル」(e.g. `MyClass.class`) を使用すること、またはメンバのシンボル名を使うことで得られる (e.g. )。`Class`オブジェクト、メンバ`Method`、`Constructor`、`Field`オブジェクト、などの名前による発見を通して得られる。例:
*  – `Method`オブジェクトを返す。`Class...`引数によって特定される引数を受け入れるクラスまたはインタフェースの"methodName"という名のpublicメソッドを表現する。
*  – `Class...`引数によって特定される引数を受け入れるクラスのpublicコンストラクタを表現する`Constructor`オブジェクトを返す。
*  – クラスまたはインタフェースの名前が"fieldName"であるpublicフィールドを表現する`Field`オブジェクトを返す。

`Method`、`Constructor`、`Field`オブジェクトはクラスのメンバを表現した動的アクセスで利用することができる。例:
*  – `get()`に渡したオブジェクトのインスタンスからフィールドの値を含む`Object`を返す。もし`Field`オブジェクトがstaticフィールドを表現するときは、`Object`引数は無視されて`null`となることがある。)
*  – `invoke()`に渡した第一`Object`引数をインスタンスとしてメソッド呼び出しの結果を含む`Object`を返す。
`Object...`引数に留まるものはメソッドによって渡される。(もし`Method`オブジェクトが静的メソッドである場合は第一`Object`引数が無視されて`null`となることがある。)

*  – コンストラクタによって呼び出されて新たに作られた`Object`インスタンスを返す。`Object...`引数はコンストラクタへ渡される。(によって呼び出されることもできるクラスとしての引数無しコンストラクタに注意すること。)

##### [[配列]]と[[プロキシ]]
`java.lang.reflect`パッケージもまた静的メソッドを含み配列オブジェクトを巧みに扱うクラスと、J2SE1.3以降登場した、特定のインタフェースを実装したプロキシクラスの動的生成をサポートするクラスを提供する。

`Proxy`クラスの実装はインタフェースを実装した補給オブジェクトによって提供される。

`InvocationHandler`の  メソッドはプロキシオブジェクトで呼び出された各々のメソッドに呼ばれる。—第一引数はプロキシオブジェクト、第二引数はプロキシによって実装されたインタフェースメソッド`Method`オブジェクト、第三引数はインタフェースメソッドへ渡す引数の配列である。`invoke()`メソッドはプロキシインタフェースメソッドを飛ぶコードを戻り値として含む`Object`を戻り値として返す。

### 
`java.io`パッケージは入出力(I/O)をサポートするクラスを含む。 パッケージにあるクラスは本来ストリーム指向である。; しかしながら、ランダムアクセスファイル (コンピュータ)としてのクラスもまた提供されている。パッケージで中心となるクラスはそれぞれバイトストリームの読み書きを行う抽象クラスであるとである。このパッケージもまた多数のファイルシステムとの相互作用をサポートする多少の様々なクラスを持っている。

#### ストリーム
ストリームクラスはストリームクラスに特色を加えたベースとなるサブクラスを拡張したDecoratorパターンに沿っている。ベースとなるストリームクラスのサブクラスはたいてい以下の特質を用いて名付けられる。:

* ストリームデータの送信元/送信先
* ストリームへ書き込まれた/読み込むデータ型
* ストリームデータ上で行われる追加処理やフィルタリング

ストリームサブクラスは`''Xxx''`が特色を記述し`''StreamType''`が`InputStream`、`OutputStream`、`Reader`、`Writer`のような名前をもつパターン`''XxxStreamType''`を使って名付けられる。

以下の表は`java.io`パッケージが直にサポートする送信元/送信先を示す:

他の標準ライブラリパッケージは、メソッドやJava EEのクラスが返す`InputStream`のような他の送信先としてストリーム実装を提供する。

データ型ハンドリング、ストリームデータのプロセッシングやフィルタリングはストリームフィルタを通してできあがっている。フィルタクラスはすべて、コンストラクタの引数としてもう一つの互換ストリームオブジェクトを受け入れ、追加された特色とともに囲まれたストリームをデコレート(*decorate*)する。ベースとなるフィルタクラス、、、を拡張することでフィルタは生成される。

`Reader`と`Writer`クラスは真に、バイトを文字にコンバートするためのデータストリームで追加処理を行うバイトストリームである。それらはJ2SE5.0から登場した静的メソッドによって返されるを使う。クラスは`InputStream`を`Reader`へとコンバートし、クラスは`OutputStream`を`Writer`へコンバートする。これら双方のクラスは特別に役立つ文字エンコーディングを許可するコンストラクタを持っている—もしエンコーディングが指定されていなければ、プラットフォームにあるデフォルトエンコーディングを使用する。

以下の表は`java.io`パッケージを直にサポートする他の処理、フィルタを示す。これらのクラスはすべて`Filter`クラスに相当するものを継承している。

#### ランダムアクセス
クラスはファイルの*[[ランダムアクセス]]*読み書きをサポートする。このクラスはファイル内の次の読込または書込命令を行うバイトオフセットを表現する*[[ファイルポインタ]]*を使用する。ファイルポインタは読み書きによって無条件に動かされ、
またはメソッドによって明確になる。
ファイルポインタのカレントポジションはメソッドによって返される。

#### ファイルシステム
 クラスはファイルシステムのファイルやディレクトリパスを表現する。  `File`オブジェクトはファイル、ディレクトリの生成、削除、リネームや「読み取り専用」や「最終更新タイムスタンプ」のようなファイル属性操作をサポートする。`File` オブジェクトはファイルとディレクトリを含むすべてのリストを得るために使われるディレクトリを表現することができる。
 クラスはバイトの送信元または廃棄先（送信先）を表現するファイル記述子である。一般的にこれはファイルであるが、コンソールやネットワークソケットにすることもできる。 `FileDescriptor` オブジェクトは`File` ストリームを生成するために使われている。それらは `File` ストリーム、`java.net` ソケットやデータグラムソケットから得られる。

### 
J2SE 1.4では、パッケージ`java.nio` (NIO または New I/O) がメモリマップドI/O、ときどき劇的にベターなパフォーマンスを得る基本ハードウェアと、よりいっそう親密な入出力命令を容易にするサポートが追加された。`java.nio` パッケージはバッファ型サポートを提供する。サブパッケージ  は文字データとは異なる文字エンコーディングサポートを提供する。サブパッケージ  はファイルやソケットのようなI/O命令演算能力がある資格を与える接続を表現する「チャネル」サポートを提供する。`java.nio.channels` パッケージもまたファイルのきめ細かいロックサポートを提供する。

### 
`java.math`パッケージは、(剰余演算を含む)多倍長精度の演算をサポートし、暗号鍵を生成するための多倍長の素数生成を提供する。以下にパッケージの主要なクラスを示す:

*  – 任意精度の符号付き10進数を提供する。 `BigDecimal` は`RoundingMode`を通して誤差の揺るまいをコントロールすることができる。
*  – 任意精度の整数を提供する。 `BigInteger`による演算は、約21億桁もの巨大な数値を扱わない限り、算術オーバーフローを生じない。標準数値演算に加えて、これは剰余演算、GCD計算、素数判定、素数生成、ビット演算など他様々な演算を提供する。
*  – 数値演算の精度などのルール設定をカプセル化する。
*  – 8つの丸め誤差を提供する列挙型である。

### 
`java.net` パッケージは他の共通トランザクションと同じくらい良質のHTTPリクエストネットワーク向けに特別なI/Oルーチンを提供する。

### 
メッセージダイジェストアルゴリズムを含んでいるセキュリティサポートは`java.security` に含まれている。

### 
`java.text` パッケージは文字列をパースするルーチンを実装し、様々な自然言語、ロケールに依存したパースをサポートする。

### 
`java.util`パッケージの中心である集約したオブジェクトデータ構造。
パッケージに含まれているものは、デザインパターンを非常に考慮したデータ構造階層、コレクションAPI(コンテナ)である。

## java.desktopモジュールのパッケージ
`java.desktop`モジュールにはデスクトップアプリに必要なパッケージが集められている。

### 

`java.beans`パッケージに含まれているものは開発やbean操作のための様々なクラスであり、JavaBeansアーキテクチャによって定義された再利用コンポーネントである。アーキテクチャはコンポーネントのプロパティ操作やそれらのプロパティが変更されたときの発火イベントのメカニズムを提供する。

`java.beans`にあるAPIの多くはbeanが結合、カスタマイズ、操作されうるbean編集ツールによる使用として書かれている。beanエディタのとあるタイプは、IDEにあるGUIデザイナである。

### 

The Abstract Windowing Toolkit(AWT)は基本的なGUI命令をサポートするルーチンを含み、
基礎を成すネィティブシステムから基本的なウィンドウズを使用する。Java API（GNUのlibgcjのような）多くの独自実装は何もかも実装しているがしかし、AWTは多くのサーバサイドアプリケーションで使われていない。このパッケージもまたJava 2DグラフィックAPIを含んでいる。

### 

Swingはプラットフォーム非依存のウィジェット・ツールキットを提供する`java.awt`を基礎とするルーチンの集合である。Swingは下層のネイティブOS独自のGUIサポートに頼る代わりに、ユーザインタフェースコンポーネントをレンダリングするために2次元描画ルーチンを使用する。

GUI上のウィジェットが下層のネイティブシステムから模倣することができるように、Swingは着脱可能なルック・アンド・フィール () をサポートする。システム全体に行き渡っているデザインパターン、特にMVCパターンの改良版は、機能と外観との間の結合度を緩めている。1点、統一されていないのは、（J2SE 1.3現在において）フォントがJavaではなく下層のネイティブシステムによって描画されるということであり、これによりテキスト移植性を限定してしまっている。次善策としては、ビットマップフォントを使うことが挙げられる。一般的に「レイアウト」が使用され、これは要素をクロスプラットフォームかつ審美眼的に一貫したGUIに保つ。

### 
様々なウェブブラウザやウェブボットの記述に関して使われる、エラー耐性のあるHTMLパーサを提供する。

## その他のパッケージ
### 

`java.rmi` パッケージは異なるJVM上にある2つのJavaアプリケーション間でのRPCをサポートする Java Remote Method Invocationを提供する。

### 

JDBC API (SQLデータベース接続で使用)の実装は`java.sql`パッケージにまとめられている。

## 廃止されたパッケージ
### 

Javaアプレット生成をサポートするために作られた`java.applet`パッケージはネットワーク越しにダウンロードされた保護されたサンドボックス上で動くアプリケーションを許可する。セキュリティ制約は簡単にサンドボックスに適用される。開発者は、例えば、それが安全であることを示すために、アプレットに電子署名を適用することができる。(ローカルハードドライブにアクセスするような)制限された処理を行うアプレットの許可を認めるため、そういう行為をユーザに許し、サンドボックスの制限を部分的または全て取り払う。デジタル証明書はThawteやEntrustのような機関によって発行される。

Java 11でJavaアプレット（appletviewer）は廃止され、使用できないにもかかわらずAPIが残っていたが、APIもJava 26で取り除かれた。

### javax.rmi

アプリケーション間のリモート間通信を提供し、RMI over IIOPプロトコルを使用する。このプロトコルはRMIとCORBAと連携させる。

Java 11で廃止された。

### org.omg.CORBA

general inter ORB protocolを使用するアプリケーション間のリモート間通信をサポートし、CORBAの他のフィーチャーをサポートする。RMIとRMI-IIOPと同じく、このパッケージは(通常、ネットワーク経由で)他の仮想マシン上で動いているオブジェクトのリモートメソッドを呼ぶためにある。 すべての通信可能性からCORBAは様々なプログラミング言語でもっともポータブルである。しかしながら、それはCORBAを理解することをもいくぶん難しくしている。

Java 11で廃止された。

## 関連項目

* Java
** Java#エディション（Java SE、Java EE、Java MEなど）
** Java#バージョン履歴
* Javaバージョン履歴
* Jakarta EE - Javaの企業サーバーシステム向けエディション（旧称: Java EE）
* Java Platform, Micro Edition (Java ME) - Javaの組み込みシステム向けエディション
* Java Card - JavaのICカード向けエディション

## 参照

## 外部リンク

* Oracle - Java SE 
** Oracle JDK 25ドキュメント 
** Java SEバージョン25 API仕様 
* JSR 59 (J2SE 1.4) 
* JSR 176 (J2SE 5.0) 
* JSR 270 (Java SE 6) 
* JSR 336 (Java SE 7)