次の項目について説明します。
さらに、次の拡張機能が導入されています。
分野: API:言語
Standard/Platform: Java SE 7
概要:カスタムクラスローダーが非循環式のクラスローダー委譲モデルに準拠していない場合は、クラスロード時にデッドロックが発生する可能性があります。クラスの並行ロード、およびクラスロード操作のためのより詳細なロックメカニズムをサポートするために、新しい API が java.lang.ClassLoader クラスに追加されました。カスタムクラスローダーでこの機能を活用するには、推奨モデルと要件について「Class Loader API Modifications for Deadlock Fix」ドキュメントを参照し、カスタムクラスローダーを適切に実装する必要があります。
分野: API:言語
Standard/Platform: JDK 7
概要: 以前は、javax.lang.model.type パッケージの 2 つの例外型 MirroredTypeException と MirroredTypesException は無関係でした。javac 実装では、MirroredTypesException がスローされるべきところで MirroredTypeException がスローされていました。この問題に対処するためもあって、MirroredTypeException が MirroredTypesException のサブクラスになりました。この変更はバイナリ互換であり、既存の注釈プロセッサの動作を通常は保持します。ただし、この変更によってクライアントプログラムのソースの互換性が失われる可能性があります。そのような場合は、catch 節の順序を変更することで、プログラムは再度コンパイル可能になるはずです。
分野: API:言語
Standard/Platform: JDK 7
概要: このリリースの言語の変更をモデル化するために、javax.lang.model.type.TypeVisitor インタフェースにメソッドが追加されるなど、いくつかの更新が javax.lang.model.* に加えられました。そのような追加により、TypeVisitor インタフェースを直接実装しているライブラリとはソースの互換性がなくなります。ただし、そのような追加はこの API の展開の一部として予見されていました。また、ライブラリはそのようなインタフェースを直接実装するのではなく、ユーティリティービジターの 1 つを拡張するよう、明示的に警告されていました。
RFE: 6933147
分野: API:言語
Standard/Platform: JDK 7
概要: メソッド Runtime.exec(String command, String[] envp, File dir)
はコマンド文字列を、デフォルトの区切り文字セット (空白文字、タブ文字、改行文字、復帰改行文字、および用紙送り文字) を使用する呼び出し new StringTokenizer(command)
によって、実行可能ファイルの名前とその引数で構成されるトークンに分割します。すなわち、このメソッドは空白を区切り文字として使用して、コマンド文字列をトークンに分割します。
Windows オペレーティングシステムでは、コマンドパラメータを空白文字で分割するとエラーになることがあります。特に、command
パラメータに、空白を含む実行可能ファイルへのパスが含まれている場合、new StringTokenizer(command)
の呼び出しによって、間違った実行可能ファイル名が抽出されます。たとえば、Runtime.getRuntime().exec("C:\\My Programs\\foo.exe bar")
の呼び出しにより、引数 Programs\foo.exe
および bar
を指定してプログラム C:\My
を起動しようとします。この呼び出しは、実行可能ファイル C:\My
が見つからないことを示す例外で失敗する可能性があります。
従来のアプリケーションでセキュリティーマネージャーが使用されていない場合 (クラス SecurityManager
を参照)、システムプロパティー jdk.lang.Process.allowAmbiguousCommands
を false
以外の任意の値で指定することによって、空白を含むパス名を、メソッド Runtime.exec
で正しく解析することができるようになります。(「The Java Tutorials」の「System Properties」を参照してください。)または、パス名を引用符で囲むこともできます。たとえば、Runtime.getRuntime().exec("\"C:\\My Programs\\foo.exe\" bar")
の呼び出しにより、引数 bar
を指定して C:\My Programs\foo.exe
を起動しようとします。
注:JDK 7u21 および 7u25 の場合、あいまいなコマンドを許可するシステムプロパティーの名前は jdk.lang.Process.allowAmbigousCommands
です。
ただし、Runtime.getRuntime().exec(<path to batch or command file>)
を起動して、 (Windows オペレーティングシステム上の) バッチ (.bat
) またはコマンド (.cmd
) ファイルを実行しようとするとき、そのファイルへのパスに次のいずれかの特殊文字が含まれる場合は、パス名を引用符で囲む必要があります。
<space> &()[]{}~=;!"+,`~
これは次のようにして行うことができます。ここで、変数 f
はクラス File
のインスタンスです。
Process p = Runtime.getRuntime() .exec(new String[]{"\"" + f.getAbsolutePath() + "\""}, null, f.getParentFile());
これは、Win32 CreateProcess 呼び出しが、.bat
および .cmd
ファイルを cmd /C
コマンドプロセッサにリダイレクトしたあと、コマンドプロセッサがこれらを実行するためです。cmd /C
コマンドでは、上記のいずれかの特殊文字を含むパスを引用符で囲む必要があります。
分野: API:ユーティリティー
Standard/Platform: JDK 7
概要: 以前は、java.util.TreeMap のエラーのため、空の TreeMaps および TreeSets に無効な null 要素や Comparable を実装していない要素を挿入できました。空の TreeMaps または TreeSets に無効な要素を 1 つだけ挿入できました。さらに要素を挿入すると、想定された NullPointerException または ClassCastException が発生していました。コレクションに対するほかの操作も、ほとんど失敗していました。JDK 7 以降は、空の TreeMap または TreeSet に無効な null 要素や Comparable を実装していない要素を挿入すると、NullPointerException がスローされます。RFE: 5045147
ProcessBuilder
クラスでは、Runtime.exec よりも簡単にサブプロセスを呼び出すことができます。実際、ProcessBuilder を使用すると、変更されたプロセス環境 (つまり、親のプロセス環境をベースにしてわずかに変更を加えた環境) でサブプロセスを開始することが簡単になりました。java.lang.Thread
クラスには、次の拡張機能が追加されました。
Thread.State
クラスと新しい getState()
API が用意されました。Thread
クラスの getStackTrace
および getAllStackTraces
メソッド。プログラミングにより、1 スレッドまたはすべてのスレッドのスタックトレースを取得できます。uncaughtExceptionHandler
メカニズムが、Thread クラスを介して直接利用できるようになりました。sleep()
メソッドの新しい形式により、1 ミリ秒未満のスリープ時間が可能になりました。java.lang.instrument
パッケージでは、メソッドのバイトコードを実行時に変更することで Java プログラミングエージェントが仮想マシン上で実行されるプログラムを計測することを可能にするサービスを提供します。Formatter
クラスでは、レイアウトの調整および位置ぞろえ、数値、文字列、および日付と時間のデータの一般的な書式、さらにはロケール固有の出力について、サポートしています。byte
、java.math.BigDecimal
、java.util.Calendar
などの一般的な Java の型をサポートします。任意のユーザー型に対する限定的な書式のカスタマイズについては、java.util.Formattable
インタフェースを使用します。java.util.Scanner
クラスは、テキストをプリミティブ型または String
型に変換します。このクラスは java.util.regex
パッケージを基にしているため、ストリーム、ファイルデータ、文字列、または Readable
インタフェースの実装者に対する正規表現ベースの検索を実行する方法も用意されています。split
メソッドが新しく追加されました。subSequence
メソッドが追加されました (String
が実装するようになった CharSequence
インタフェースで必要)。matches
、replaceAll
、および replaceFirst
という 3 つのメソッドが追加されました。subSequence
メソッドが追加されました (StringBuffer
が実装するようになった CharSequence
インタフェースで必要)。interrupt
メソッドが、チャネル入出力操作でブロックされるスレッドに割り込めるように改訂されました。java.util.prefs
パッケージが実装する Preferences API を使用すれば、ユーザーおよびシステムの設定および構成データをアプリケーションから格納および取得できます。このデータは、実装ごとに異なるバッキングストアに永続的に保存されます。Preferences API は、java.util.Properties
クラスの使用頻度の高いプロパティーを置き換える目的で設計されており、軽量さを維持しながら、さまざまな点を訂正しています。java.lang.StrictMath
- java.lang.StrictMath
クラスの API は、従来の java.lang.Math
クラスの API と同じです。java.lang.Math クラスは、以前のバージョンの Java プラットフォームから存在しています。ただし、Math
クラスと異なり、StrictMath
クラスは、すべての実装でビットごとの再現可能な結果を返すように定義されています。java.lang.Math
- クラス java.lang.Math
は、クラス StrictMath
と同じ API のセットを提供します。ただし、クラス StrictMath
の一部の数値関数とは違って、クラス Math
の等価な関数のすべての実装は、ビット単位まで同じ結果を返すようには定義されておらず、特定の制約内で結果が異なることがあります。このため、厳密な再現性が要求されない実装においてパフォーマンスの向上が可能になります。Countdown.java
は、Timer API を使用した簡単なデモアプリケーションです。java.lang.Runtime
には、3 つのメソッドが追加され、この機能に対して移植性のある簡単なインタフェースが提供されます。新しいメソッドは次の 3 つです。
また、Runtime.exit
メソッドも改訂されました。詳細は、「シャットダウンフック API の設計」を参照してください。java.util.zip
および java.util.jar
クラスの API が拡張され、次のモードが追加されました。
java.util.zip.OPEN_READ
java.util.zip.OPEN_DELETE
java.util.zip.ZipFile(File file, int mode)
java.util.jar.JarFile(File file, boolean verify, int mode)
JarURLConnection
を開くたびに、Jar ファイルの日付を保持する一時ローカルファイルが作成され、JarFile オブジェクトがその一時ファイルの先頭に作成されます。このとき、各一時ファイル上で開いているファイルハンドルおよび記述子が閉じなかったため、サーバーアプリケーションを長時間実行している場合は、一時ファイルによってディスク容量がすぐにいっぱいになる可能性がありました。この新しい API では、Zip ファイルおよび Jar ファイルを開くときに、新しい delete-on-close モードを使用できるので、この問題を解決できます。