71
Java SE 7 で切り開く新しい Java の世界について 日本オラクル株式会社 Fusion Middleware 事業統括本部 シニア Java エバンジェリスト 寺田 佳央 ブログ: http://yoshio3.com (本日の資料は後日ブログで公開します)

New Feature of Java SE 7

Embed Size (px)

DESCRIPTION

This explain the new feature of Java SE 7.Project Coin, NIO.2, Fork/Join, invokeDynamic and so on.

Citation preview

Page 1: New Feature of Java SE 7

<Insert Picture Here>

Java SE 7 で切り開く新しい Java の世界について 日本オラクル株式会社 Fusion Middleware 事業統括本部 シニア Java エバンジェリスト 寺田 佳央 ブログ: http://yoshio3.com (本日の資料は後日ブログで公開します)

Page 2: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved. 2

以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。

OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。

Page 3: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

アジェンダ

3

7 はじめに プロジェクト Coin Java NIO.2 Da Vinci Machine Peoject Fork/Join フレームワーク 国際化関連

クラスローダの拡張

ネットワークプロトコルの追加サポート まとめ

Page 4: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

はじめに

Page 5: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

自己紹介寺田 佳央 ‒ http://yoshio3.com •  2001 年 日本サン・マイクロシステムズ株式会社入社 •  Java/GlassFish Evangelist •  Software Ambassador •  日本 GlassFish ユーザグループ

•  2010 年 日本オラクル株式会社入社 •  Java エバンジェリスト •  Java SE/EE の啓蒙活動を中心

•  ブログ、Twitter 等の SNS •  http://yoshio3.com, @yoshioterada

5

Page 6: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved. 6

Oracle は今後も積極的に Java に投資します。

Page 7: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Oracle の Java に対する姿勢

7

"Java is the single most important software asset we have ever acquired." 「Java は私たちが今までに取得した中で 最も重要なソフトウェア資産です。」

– Larry Ellison

Page 8: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved. 8

7革命 進化

1996 � 1997 � 1998 � 2000 � 2002 � 2004 � 2006 � 2011� 2012 �

1.0�

1.1�

1.2�

1.3� 1.4�

5.0�

6 8

Page 9: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved. 9

2011年7月7日

Java SE 7 リリース

Page 10: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved. 10

7Project Coin (JSR 334) NIO.2 (JSR 203) Fork/Join Framework InvokeDynamic (JSR 292)

•  クラスローダの拡張 •  国際化の拡張

•  Unicode 6.0 •  IETF BCP47, UTR 35 •  ISO 4217 通貨コード •  Locale の拡張

•  URLClassLoader のクローズ

•  SDP & SCTP •  セキュリティの拡張

•  TLS 1.2 •  ECC

•  Swing JLayer •  XRender Pipeline for Java 2D(X11環境) •  JDBC 4.1

Page 11: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved. 11

プロジェクトCoin 言語仕様に関する小さな変更

Page 12: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

プロジェクトCoin言語仕様に関する小さな改良

•  switch構文における文字列の使用 •  数値表現形式の追加 •  バイナリ数値表現の追加 •  数値表現における”_”の使用が可能 (可読性の向上)

•  例外ハンドリングの改良 •  例外のマルチキャッチ •  例外の再送

•  ジェネリックなインスタンス生成のための型推論の改善 •  プロジェクト diamond

•  リソースを含む try 構文 •  単純化された可変引数メソッドの呼び出し

12

Page 13: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

switch構文における文字列の使用

 String s = “”;  switch(s){ case “true”: doTrue();

break;

case “false”: doFalse(); break;

default:

doDefault();

break;

 }

13

• switch 構文における文字列(String)の使用

Page 14: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

数値表現形式の追加

•  バイナリ表記 •  1 (10進表記) •  01 (8進表記) •  0x1 (16進表記) •  0b1 (バイナリ表記)

•  “_”(アンダースコア)表記 •  数値表現中に”_”を記載し意味ある単位に分割可能 •  可読性の向上を目的として追加された仕様 •  内部的には処理前に、replaceAll(“_”,””)で “_”が排除

14

byte data = (byte)0b00100001

(8bitのバイト表示)

long creditCardNumber = 1234_5678_9012_3456L;

int binryData = 0b1001_1001;

Page 15: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

例外ハンドリングの改良マルチキャッチ •  Java SE 6 の例外キャッチ

15

 try{

…  }catch(FileNotFoundException fnfe){

 }catch(IOException ioe){

 }

 try{

…  }catch(FileNotFoundException|IOException ex){ ex.printStackTrace();

 }

•  Java SE 7 の例外キャッチ(複数の例外をキャッチ可能)

Page 16: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

例外ハンドリングの改良例外の再送-JDK 6まで •  try ブロック中で発生した例外を再送する場合 •  Exception の親クラスThrowableでキャッチ •  Throwableのインスタンスをthrow

•  問題 •  メソッドの定義で”throw Throwable”が必要

16

 try {

…  } catch (Throwable ex) {

logger.log(ex);

throw ex;//throw Throwable を宣言しない場合コンパイルエラー

 }

Page 17: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

例外ハンドリングの改良例外の再送-JDK 7 •  try ブロック中で発生した例外を再送する場合 •  Exception の親クラス Throwable を final 指定でキャッチ •  メソッドの定義で”throw Throwable”が不要 •  try ブロック中で発生する例外のみ再送可能

17

 try {

…  } catch (final Throwable ex) { logger.log(ex);

throw ex

 }

Page 18: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Genericsインスタンス生成にける型推論の改善

•  Java SE 6 まで

18

Map<String, String> map = new HashMap<String, String>(); Map<String, Map<Integer, String>> map = new HashMap<String, Map<Integer, String>>();

Map<String, String> map = new HashMap<>(); Map<String, Map<Integer, String>> map = new HashMap<>();

•  Java SE 7 から

•  Generics における型安全性の保証は強力 •  インスタンス生成時の冗長的な記述は可読性が低下

•  <>”ダイヤモンド”を記述し可読性が向上

Page 19: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

リソースを含む try 構文 •  try で Closeable インタフェースの実装クラスを記述 •  finaly で close 処理の記述が不要 •  自動的にリソースのclose() が実行

19

private static void copyFile(File source, File target) { try (InputStream fin = new FileInputStream(source); OutputStream fout = new FileOutputStream(target)){

byte[] buf = new byte[8192];

int i;

while ((i = fin.read(buf)) != -1) {

fout.write(buf, 0, i);

}

}catch (Exception e) {

e.printStackTrace();

}

}

Page 20: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Java NIO.2 関連

Page 21: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

JSR 203: NIO.2More New I/O APIs for the Java™ Platform •  JSR 51: New I/O APIs for the Java™ Platformの改良 API •  新規ファイルシステム API を提供 •  便利なファイル操作処理が追加

•  新しいディレクトリ、ファイル表現クラス (Path) を提供 •  ファイル属性、権限の取得・設定 API を提供 •  ディレクトリツリーの走査用 API を提供 •  ディレクトリ中の変更通知機能 API を提供 •  非同期 I/O の改善

21

Page 22: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Java NIO.2 適用の利点

• パフォーマンスの大幅な改善

22

Page 23: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Java NIO.2 適用の利点

Java NIO.2 適用前 全ファイルシステムを同一視で処理

ファイルシステムの走査が不可

ファイル操作APIが欠如 シンボリックリンクの未サポート

ファイル属性の読み書き処理が不可

ファイル権限の処理が不可

適切な例外ハンドリングが不可

ファイルシステムの変更通知が不可

非同期I/Oのサポート不足 zip ファイル操作用APIの不足

Java NIO.2 適用後 ファイルシステム用のAPI を提供 ファイルツリーによる走査が可

ファイル操作用API (コピー、削除、移動等) シンボリックリンクをサポート

ファイル属性を扱う事が可能

ファイル権限を扱う事が可能

適切な例外ハンドリングが可能

ファイルシステムの変更通知が可能

非同期 I/O をサポート

zip をファイルシステムとして処理可能

23

Page 24: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

ファイルシステム API •  NIO.2 主要パッケージ •  java.nio.file •  java.nio.file.attribute •  java.nio.file.spi

•  FileSystem クラス •  ファイルシステムに対するインタフェースを提供 •  ファイルシステム中のファイル・ディレクトリにアクセスするオブジェクトのファクトリメソッドを提供

•  デフォルトのファイルシステムを取得:getDefault() •  Path インタフェース •  ファイルシステム中のファイル、ディレクトリを表現 •  java.io.File と java.nio.file.Path の双方向変換 •  java.io.File#toPath() 、java.nio.file.Path#toFile() を使用

24

Page 25: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

FileSystems から FileSystem の生成例java.nio.file.FileSystems, java.nio.file.FileSystem

��� FileSystem fSystem = FileSystems.getDefault();! Path path1 = fSystem.getPath("/var/tmp/README.txt");! try(BufferedReader reader = !                Files.newBufferedReader(path1,!                       Charset.forName("UTF-8"))) {! String line;! while ((line = reader.readLine()) != null)! System.out.println(line);! } catch (IOException ioe) {! ioe.printStackTrace();! }

25

FileSystemsファクトリメソッドからデフォルトFileSystemオブジェクトを生成

Page 26: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Paths クラスから Path インスタンスの生成例java.nio.file.Paths, java.nio.file.Path

26

Path path1 = Paths.get("/var","tmp","README.txt");! Path path2 = Paths.get(URI.create("file:///var/tmp/README.txt"));! Path path3 = Paths.get(System.getProperty("user.home"),"README.txt");

Page 27: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Path の操作例Path に関する情報取得

27

Path path = Paths.get("/var","tmp","README.txt");! System.out.format("toString: %s%n", path.toString());! System.out.format("getFileName: %s%n", path.getFileName());! System.out.format("getName(0): %s%n", path.getName(0));! System.out.format("getNameCount: %d%n", path.getNameCount());! System.out.format("subpath(0,2): %s%n", path.subpath(0,2));! System.out.format("getParent: %s%n", path.getParent());! System.out.format("getRoot: %s%n", path.getRoot());

toString: /var/tmp/README.txt! getFileName: README.txt //ファイル名の取得! getName(0): var //Path オブジェクトの 0番目の要素を表示! getNameCount: 3 //Path オブジェクトの要素数! subpath(0,2): var/tmp //指定された要素のパス! getParent: /var/tmp //親ディレクトリ! getRoot: / //ルートディレクトリ

じk�実行例:

Page 28: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Path の操作例ドット表記の削除-カレント(.)、親ディレクトリ(..)

28

Path path = Paths.get(URI.create(”! file:///var/test/../tmp/README.txt")); ! Path norm = path.normalize();! System.out.format("path.toString: %s%n", ! path.toString());! System.out.format("norm.toString: %s%n", ! norm.toString());

path.toString: /var/test/../tmp/README.txt! norm.toString: /var/tmp/README.txt

実行例:

※ normalize() メソッドは実際のファイルの存在の有無はチェックしない表記のみ

Page 29: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Path の操作例ドット表記の削除-カレント(.)、親ディレクトリ(..)

29

Path path2 = Paths.get("../","var","test","README.txt"); ! try{! Path real = path2.toRealPath(true);! System.out.format("real.toString: %s%n", real.toString());! }catch(java.nio.file.NoSuchFileException | IOException ioe){! ioe.printStackTrace();! }!

��� real.toString: /var/test/README.txt

実行例:

※ toRealpath() メソッドは実際のファイルの存在をチェック

Page 30: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Path の操作例相対パスの取得

30

Path path = Paths.get("/var/tmp/foo");! Path path2 = Paths.get("/var/tmp/bar");!! Path fooToBar = path.relativize(path2);! System.out.format("fooToBar.toString: %s%n", !                                fooToBar.toString());

fooToBar.toString: ../bar

実行例:

Page 31: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

ファイル操作用 APIjava.nio.file.Files クラス •  クラス中のメソッドは全てクラス (static) メソッド •  ファイル、ディレクトリ、シンボリックリンク等を操作 •  基本操作 •  作成(ディレクトリ作成、ファイル作成、シンボリック作成、テンポラリディレクトリ作成、テンポラリファイル作成)、コピー、削除、移動、存在有無の確認、ディレクトリの走査等

•  属性関連 •  全ファイル属性の読み込み、属性の更新、属性取得、最終更新日付の取得、オーナーの取得、権限の取得、ディレクトリの存在確認、実行可能権限の確認、読み込み権限の確認、書き込み可能権限の確認、ファイルサイズの取得等

•  読み書き •  バイト単位、行単位の読み書き処理等

31

Page 32: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

ディレクトリの作成例java.nio.file.Files#createDirectory

32

 public class CreateDirectory{! public static void main(String argv[]){! Path directory = Paths.get("/var/tmp/dir");! try{! Files.createDirectory(directory);! }catch(IOException ioe){! ioe.printStackTrace();! }! }! }

Page 33: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

追加書き込みモードでファイルのオープンjava.nio.Files#newOutputStream

33

Path textFile = Paths.get("C:\\test.txt");! try(OutputStream out = Files.newOutputStream(textFile, ! StandardOpenOption.APPEND);! BufferedWriter bout = new BufferedWriter(! new OutputStreamWriter(out,"UTF-8"))){! bout.write("ADDITIONAL TEXT\n");! }catch(IOException e){! System.err.println(e);! }!

newOutputStream(path,OpenOption) に APPEND を指定してオープン

try-with-resource 構文を使用し close の記述も不要

Page 34: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

ファイルのコピー例java.nio.file.Files#copy

34

try{! from = new FileInputStream(sourceFile);! to = new FileOutputStream(toFile);! byte[] buffer = new byte[4096];! int byteRead;! while((byteRead = from.read(buffer)) != -1)! to.write(buffer,0,byteRead);!} catch(IOException){} finally{! …! } ※ Java SE 6 までのコピーコード例

FileSystem local = FileSystems.getDefault();! Path from = local.getPath(sourceFile);! Path to = local.getPath(toFile);! Files.copy(from, to, REPLACE_EXISTING); !

NIO.2 の利用例

Page 35: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

シンボリックリンクの作成java.nio.Files#createSymbolicLink

35

 Path target = Paths.get("/tmp/source.txt");! Path newLink = Paths.get("/tmp/symbolic.txt");! try{!    Files.createSymbolicLink(newLink, target);! }catch(IOException | UnsupportedOperationException e){!    System.err.println(e);! }!

※ シンボリックリンクをサポートしない環境で実行した場合

java.lang.UnsupportedOperationException:

Symbolic links not supported on this operating system

Page 36: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

ディレクトリツリーの走査java.nio.Files#walkFileTree •  起点パスから指定した深さの階層までディレクトリを走査 •  ファイル・ディレクトリに対してFileVisitor のメソッドを実行 •  postVisitDirectory, preVisitDirectory, visitFile, visitFileFailed

36

final FileSystem fs = FileSystems.getDefault();! Path startPath = fs.getPath(startDir);! SimpleFileVisitor visitor = new SimpleFileVisitor<Path>(){! @Override! public FileVisitResult visitFile(Path file, ! BasicFileAttributes attr) throws IOException{! PathMatcher matcher = fs.getPathMatcher("glob:*.txt");! if(matcher.matches(file.getFileName()))! System.out.println(file.toAbsolutePath());! return super.visitFile(file, attr);! }};! Files.walkFileTree(startPath, visitor);!

指定したディレクトリ配下に存在するテキストファイルを絶対パスで出力

Page 37: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

ファイルシステムの変更通知

•  ネィティブなファイルシステム監視サービスを提供 •  OS が提供するネィティブ機能を利用するため低オーバヘッド •  OS が機能を提供しない場合 Java 内で実装(低パフォーマンス)

•  WatchService インタフェース •  OS の差異を吸収するインタフェース

•  Watchable インタフェース •  Path クラスで Wathable インタフェースを実装 •  register メソッドで WatchService と取得したいイベントを登録 •  イベントタイプ(作成、削除、変更など)

•  WatchKey インタフェース •  WatchService が登録された Watchable オブジェクトのキー •  Watchable によって伝搬された伝搬されたイベントを処理 •  イベントのポーリング、イベントの取得、削除

37

Page 38: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

ファイルシステムの変更通知

38

FileSystem fs = FileSystems.getDefault();! WatchService ws = fs.newWatchService();! Path path = fs.getPath("C:\\tmp");! path.register(ws, StandardWatchEventKind.ENTRY_CREATE, ! StandardWatchEventKind.ENTRY_DELETE, ! StandardWatchEventKind.ENTRY_MODIFY);! for (;;) {! WatchKey key = ws.take();! List<WatchEvent<?>> events = key.pollEvents();! for (WatchEvent obj : events) {! System.out.println(obj.kind().name()+ "\tFileName: " ! + obj.context().toString());! }! key.reset();! }!

ファイルシステム固有のサービス取得

特定のパス配下の変更通知イベントを登録

キューに存在する WatchKey の取得と削除

キーに紐ずく全保留イベントの取得

次の変更通知を検知するためリセットし再度キューイング

Page 39: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

ストレージ情報の取得FileStore クラス

39

 FileSystem fs = FileSystems.getDefault();! for(FileStore fstore: FileSystems.getDefault().getFileStores()){!    long total = fstore.getTotalSpace() / 1024 ;!    long used = (fstore.getTotalSpace() – !                       fstore.getUnallocatedSpace()) / 1024 ;!    long available = fstore.getUsableSpace() / 1024 ;!    System.out.format(“%-15s %10d %14d %16d %n”,!                               fstore,total,used,available);! }! }!

•  ストレージ(デバイス、パーティション、ボリューム)の情報取得 •  ファイルが存在するストレージ情報、全ストレージ情報取得 •  FileStore.getFileStore(path), FileSystems.getDefault().getFileStores();

全ストレージ情報の取得例

Page 40: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved. 40

Da Vinci Machine Project JSR 292:

Supporting Dynamically Typed

Languages on the JavaTM Platform

Page 41: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

今までの Java プラットフォーム

Java言語で実装されたアプリケーションの実行環境

Page 42: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

マルチ言語プラットフォーム

Java言語以外で実装されたアプリの動作も可能

今後の Java プラットフォーム

Python�

Page 43: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved. 43

Page 44: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Java 仮想マシン言語仕様 1997

•  The Java Virtual Machine knows nothing about the Java programming language, only of a particular binary format, the class file format.

•  A class file contains Java Virtual Machine instructions (or bytecodes) and a symbol table, as well as other ancillary information.

•  Any language with functionality that can be expressed in terms of a valid class file can be hosted by the Java virtual machine.

•  Attracted by a generally available, machine-independent platform, implementors of other languages are turning to the Java Virtual Machine as a delivery vehicle for their languages.

•  In the future, we will consider bounded extensions to the Java Virtual Machine to provide better support for other languages.

 将来、他言語をサポートするため JavaVM の拡張を検討する

44

Page 45: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Invokedynamic バイトコード命令の追加 java.lang.invoke

•  JavaVM がより柔軟なメソッド呼び出しを可能にし動的言語をより動作させやすくするバイトコード命令

• 動的言語の開発者はメソッドに含まれるターゲットタイプを指定せず、メソッド呼び出しをバイトコードに記述する事が可能

• 型情報を後から与える事が可能 •  Invokedyanamic 命令の構文

•  Invokedynamic <メソッド名、記述子> <n> •  記述子:戻り値の型と引数

45

Page 46: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Reflection より高速な MethodHandlejava.lang.invoke.MethodHandle

• 新しい動的リンクメカニズムの提供 •  MethodHandle :invokedyanamic のバイトコード命令に対するレスポンス中で正しいメソッド呼び出しを行う

•  Reflection より実行オーバヘッドが少で高速実行が可能

•  MethodHandle 使用時には下記2オプションを追加(Dev Preview時) •  -XX:+UnlockExperimentalVMOptions -XX:+EnableMethodHandles

46

������ MethodType mt;! MethodHandle mh;! MethodHandles.Lookup lookup = MethodHandles.lookup();! mt = MethodType.methodType(String.class, char.class, ! char.class);! mh = lookup.findVirtual(String.class, "replace", mt); ! String s = (String) mh.invokeExact("daddy",'d','n'); ! System.out.println(s);!

Page 47: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

JSR-166y

Java Concurrency Util

Fork/Join フレームワーク

Page 48: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Java Concurrency UtilitiesJSR-166 ができるまで •  Java SE 1.4 まで並列処理の実装は困難 •  wait(), notify(), synchronized() は機能として十分 •  アプリケーションに低レベル API での実装を要求 •  正しい実装は困難 •  間違いが発生しやすい •  間違えた実装によりパフォーマンスの低下

48

Page 49: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Java Concurrency UtilitiesJSR-166 の目標 •  並列処理の実装を容易に •  幅広く再利用可能な並列処理用の API を提供 •  スケーラビリティ、パフォーマンス、メンテナンス性、可読性の向上、スレッドセーフ実装

49

Page 50: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

マルチコア CPU を有効活用可能CPU 数を取得しスレッド数を決定

50

//使用可能なプロセッサ数を取得! int threadNum = Runtime.getRuntime().availableProcessors();! //CPU 分のスレッドプールを生成! ExecutorService pool =! Executors.newFixedThreadPool(threadNum);!

マルチコアの CPU を最大限に活用可能

マルチコア CPU の利用状況

Page 51: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Java SE 7 で導入Fork/Join フレームワークの概念

•  大きな問題を細かい問題に分割し、分割した問題を個別に解決した後、最後に結果を集計

51

大きな問題

細かい

問題

細かい

問題

細かい 問題�

個別

処理

個別

処理

個別

処理

結合した結果

Page 52: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

マージソートの実装例Fork/Join を使用しない場合

52

 class MergeSort{ ! public int[] sort(int[] all){! if (all.length == 1) { ! return all;! } else { ! int[] left = new int[all.length/2]; ! System.arraycopy(all,0,left,0,left.length]; ! int[] right = new int[all.length – left.length];! System.arraycopy(all,left.length,right,!                                          0,right.length);! left = sort(left); ! right = sort(right); ! merge(left,right,all); ! return all;! }! }}!

左右の再帰処理を

別スレッドで実現したい

Page 53: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

マージソートの実装例Fork/Join を使用しない場合

53

public class MergeSort{ !    public int[] sort(int[] all){!    int threads = Runtime.getRuntime().availableProcessors();!    ForkJoinExecutor pool = new ForkJoinPool(threads); !    SortImpl sort = new SortImpl(all); !    pool.invoke(sort); !    return sort.result;!}!private class SortImpl extends RecursiveAction{ !    private int[] all; !    private int[] result;!    

    SortImpl(int all){ !        this.all = all;!    }! 次ページへ続く …!

ForkJoinPoolの生成と

コンカレントスレッドで実行

Page 54: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

マージソートの実装例Fork/Join を使用しない場合

54

protected void compute(){ ! if ((all.length < 10 )) {! result = sequentialSort(all); ! } else {! int[] left = new int[all.length/2]; ! System.arraycopy(all,0,left,0,left.length); ! int[] right = new int[all.length – left.length];! System.arraycopy(all,left.length,right,0,right.length);! SortImpl task1 = new SortImp(left); ! SortImpl task2 = new SortImp(right); ! invokeAll(task1,task2); ! left = task1.result;! right = task2.result; ! merge(left,right,all); ! result = all;! }}!

タスク分割の閾値を設定

十分小さい場合は逐次処理

閾値が小さいすぎると並列化のオーバヘッドが増加

タスクを分割し実行

Page 55: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

国際化関連

Page 56: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Unicode 6.0 のサポート

•  Java SE 6 : Unicode 4.0 準拠 •  Java SE 7 : Unicode 6.0 準拠 •  Unicode 6 •  http://www.unicode.org/versions/Unicode6.0.0/ •  Unicode 5.1 から 2,088 個の追加文字 •  携帯電話で特に重要な1,000を超える記号追加 •  http://unicode.org/Public/UNIDATA/EmojiSources.txt

•  新しい公式インド通貨記号:インドルピー記号 •  222文字の中国、台湾、日本で共通に使われるCJK統合漢字文字追加

•  603文字のアフリカ言語サポートのための文字追加 •  ティフィナグ文字、エチオピア文字、バムン文字への拡張

•  3つの文字体系追加: マンダ文字、バタク文字、ブラーフミー文字

56

Page 57: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

ISO 4217 通貨コードの拡張をサポート

•  通貨コードの更新に JRE のアップデート再インストールは不要 •  今までは通貨コードデータが JRE の jar に含まれていたため通貨コードの更新には JRE 自身を更新するしか方法はなかった

•  デフォルトの通貨コードを上書き可能 •  <JAVA_HOME>/lib/currency.properties ファイルを用意 •  ISO 3166 で定義される国コードと ISO 4217 の通貨コードをキー/値のペアで設定

•  通貨コードはアルファベットコード、数値コード、マイナーユニットで構成 •  日本の通貨コード設定例: JP=JPZ,999,0

•  java.util.Currency クラスに追加されたメソッド •  getAvailableCurrencies : 利用可能な全通貨コードの取得 •  getNumericCode:インスタンスの ISO 4217 数値コードの取得 •  getDisplayName:デフォルトロケールの通貨コードの表示名を取得 •  getDisplayName:指定したロケールの通貨コードの表示名を取得

57

Page 58: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

その他の国際化関連の機能

•  java.util.Locale.Category 列挙型の追加 •  ロケール設定時に“表示用データ (DISPLAY) ”と、“日付、数値、通貨データ (FORMAT)”を分けて使用可能

•  Locale クラスにおける BCP47, UTR35 のサポート •  java.awt.font.NumericShaper.Range 列挙型の追加 •  正規表現で Unicode のポイントを検索可能 •  Perl 形式も可能: •  String hexPattern = "\x{" + Integer.toHexString(codePoint) + "}";

58

Page 59: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

クラスローダの拡張

Page 60: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

クラスローダの機能強化

•  Bug ID: 4670071 の対応 •  バグ登録日:2002/4/17 •  修正対応版:Java SE 7 ビルド 47(2009/Q1)

•  バグの概要 •  特定のカスタムクラスローダにおいてデッドロックが発生

•  修正前 •  ロードするクラス名に関係なくクラスローダをロック •  複数のスレッドから関連するクラスを呼び出す際にデッドロックが発生

•  修正後 •  ロードするクラス名とクラスローダの対でロック •  デッロック問題は消滅 •  参考:http://tinyurl.com/6xln947, http://tinyurl.com/64lx7p7

60

Page 61: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

ネットワークプロトコルの追加サポート

Page 62: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

SCTPStream Control Transmission Protocol •  SCTP はトランスポート層のプロトコル •  IPネットワーク上で電話網の制御信号を転送するため開発

•  TCP, UDP に類似、弱点を改善し高信頼 •  マルチホーミング •  両端接続で複数のIPを利用可能)

•  マルチストリーミング •  一つのストリームで複数ストリーム配信

•  パッケージ •  com.sun.nio.sctp パッケージ •  SctpChannel クラス、SctpServerChannel クラス •  利用可能だが Java SE の通常パッケージには含まれない

62

アプリケーション層

プレゼンテーション層

セッション層

トランスポート層

ネットワーク層

データリンク層

物理層

OSI 7 階層モデル

ご参考 URL :

http://tinyurl.com/69vd2oh

Page 63: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

SDPSockets Direct Protocol •  ハイ・パフォーマンス・コンピューティング環境用 •  InfiniBand Trade Association によって定義されたプロトコル •  Remote Direct Memory Access (RDMA)機能を提供 •  ネットワークデータ転送時のパフォーマンスボトルネックを解消

•  RDMA •  コンピュータメモリに直接アクセスし他のコンピュータに直接書き込み可能 •  OS を介さないためハイ・パフォーマンスなデータ転送が可能

•  Solaris ・ Linux 環境でサポート •  java -Dcom.sun.sdp.conf=sdp.conf -Djava.net.preferIPv4Stack=true MyApplication

•  参考 •  http://download.oracle.com/javase/tutorial/sdp/sockets/index.html

63

Page 64: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

まとめ

Page 65: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Java SE 7(JSR-336) の新機能概要

65

機能 JSR 詳細

仮想マシン JSR-292 動的型言語のサポート (InvokeDynamic)

言語仕様 JSR-334 言語仕様の小規模な拡張 (プロジェクトCoin)

クラスローダの拡張

URLClassLoaderのクローズ

Fork/Join (jsr166y)

国際化 Unicode 6.0

java.util.LocaleのIETF BCP 47 and UTR 35

Locale の拡張

ISO 4217 通貨コードの Extensible サポート

I/O関連 JSR-203 Java NIO. 2

SCTP (Stream Control Transmission Protocol)

SDP (Sockets Direct Protocol)

Use the Windows Vista IPv6 stack

セキュリティ TLS 1.2

楕円曲線暗号

Page 66: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved. 66

機能 JSR 詳細

JDBC JDBC 4.1

クライアント XRender pipeline for Java 2D

Create new platform APIs for 6u10 graphics features

Nimbus look-and-feel for Swing

Swing JLayer component

Web Update the XML stack

Java SE 7 の新機能概要

Page 67: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved. 67

2011年7月7日

Java SE 7 リリース

Page 68: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Java SE の今後

•  Java SE のロードマップ •  Java SE 7 (JSR-336) : 2011年 7 月7 日 •  Java SE 8 (JSR-337) : 2012年 後半

•  HotSpot VM と JRockit VM について •  何れの開発も継続します。 •  中~長期的:機能統合を予定しています。

68

Page 69: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

参考情報

•  OpenJDK •  http://openjdk.java.net/ •  新機能一覧:http://openjdk.java.net/projects/jdk7/features/

•  JDK 7 Project •  http://jdk7.java.net/ •  JDK 7 API: http://download.java.net/jdk7/docs/api/

•  The Java™ Tutorial •  http://download.oracle.com/javase/tutorial/

69

Page 70: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved.

Page 71: New Feature of Java SE 7

イメージを表示できません。メ

Copyright© 2011, Oracle. All rights reserved. 71