Java Platform, Standard Edition

多くのJavaプラットフォームプログラムで役立つJava APIの集合体

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

Javaのエディション
Javaカード
Java ME (Micro)
Java SE (Standard)
Jakarta EE
JavaFX
テンプレートを表示

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 SEを拡張した企業向けのエディションであるJakarta EE(旧称: Java Platform, Enterprise Edition / Java EE)にて定義されている。

下記は主要なJava SEパッケージの説明である。全てのパッケージリストはJava SE 9 API Javadocsを参照。

一般的なパッケージ

編集

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

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

java.langの主なクラス:

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

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

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

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

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

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

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

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

参照型とリファレンスキューのより首尾よい説明は"Reference Objects and Garbage Collection" を参照。

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

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

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

Discoveryはだいたいオブジェクトから始まり、Classのオブジェクトを取得するObject.getClass()メソッドを呼び出す。Classオブジェクトはクラスの中身を発見する数種のメソッドを持つ。以下にその例を示す:

  • getMethods() – クラスまたはインタフェースのpublicメソッドすべてをMethodオブジェクトの配列として返す。
  • getConstructors() – クラスのpublicコンストラクタすべてをConstructorの配列として返す。
  • getFields() – クラスまたはインタフェースのpublicフィールドすべてをFieldオブジェクトの配列として返す。
  • getClasses() – クラスまたはインタフェースのメンバ(e.g. 内部クラス)としてのpublicなクラスまたはインタフェースすべてをClassの配列として返す。
  • getSuperclass() – クラスまたはインタフェースのスーパークラスをClassオブジェクトを返す。インタフェースの場合は常にnullを返す。
  • getInterfaces() – クラスまたはインタフェースによって実装されているすべてのインタフェースをClassオブジェクトの配列として返す。
Use by name
編集

Classオブジェクトは「クラスリテラル」(e.g. MyClass.class) を使用すること、またはメンバのシンボル名を使うことで得られる (e.g. Class.forName("mypackage.MyClass"))。Classオブジェクト、メンバMethodConstructorFieldオブジェクト、などの名前による発見を通して得られる。例:

  • getMethod("methodName", Class...)Methodオブジェクトを返す。Class...引数によって特定される引数を受け入れるクラスまたはインタフェースの"methodName"という名のpublicメソッドを表現する。
  • getConstructor(Class...)Class...引数によって特定される引数を受け入れるクラスのpublicコンストラクタを表現するConstructorオブジェクトを返す。
  • getField("fieldName") – クラスまたはインタフェースの名前が"fieldName"であるpublicフィールドを表現するFieldオブジェクトを返す。

MethodConstructorFieldオブジェクトはクラスのメンバを表現した動的アクセスで利用することができる。例:

  • Field.get(Object)get()に渡したオブジェクトのインスタンスからフィールドの値を含むObjectを返す。もしFieldオブジェクトがstaticフィールドを表現するときは、Object引数は無視されてnullとなることがある。)
  • Method.invoke(Object, Object...)invoke()に渡した第一Object引数をインスタンスとしてメソッド呼び出しの結果を含むObjectを返す。

Object...引数に留まるものはメソッドによって渡される。(もしMethodオブジェクトが静的メソッドである場合は第一Object引数が無視されてnullとなることがある。)

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

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

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

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

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

ストリーム

編集

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

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

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

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

java.ioパッケージが直にサポートする送信元/送信先
送信元/送信先 接頭辞 ストリーム型 入出力 クラス
バイト (情報) 配列 (byte[]) ByteArray byte in, out ByteArrayInputStream, ByteArrayOutputStream
文字配列 (char[]) CharArray char in, out CharArrayReader, CharArrayWriter
ファイル File byte, char in, out FileInputStream, FileOutputStream, FileReader, FileWriter
文字列 (StringBuffer) String char in, out StringReader, StringWriter
スレッド (Thread) Piped byte, char in, out PipedInputStream, PipedOutputStream, PipedReader, PipedWriter

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

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

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


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

java.ioパッケージを直にサポートする他の処理、フィルタ
命令 接頭辞 ストリーム型 入出力 クラス
バッファリング Buffered byte, char in, out BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter
「プッシュバック」 最後の値を読む Pushback byte, char in PushbackInputStream, PushbackReader
読込/書込 プリミティブ型 Data byte in, out DataInputStream, DataOutputStream
直列化(シリアライズ) (読込/書込オブジェクト) Object byte in, out ObjectInputStream, ObjectOutputStream

ランダムアクセス

編集

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

ファイルシステム

編集

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

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

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

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

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

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

特殊パッケージ

編集

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

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を含んでいる。

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

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

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

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

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

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

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

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

関連項目

編集

外部リンク

編集