JavaSE6新機能メモ

JavaSE6をちょっと調べたので貼っておく。

Scripting JSR-223 Scripting for the Java Platform

  • スクリプトエンジンを開発するためのフレームワークが追加された。
  • Javaコード中にスクリプトをミックスして記述するためのAPIが追加された。
  • JavaScriptエンジン(Mozilla Rhino(ライノ) engine)がJDKに含まれる。これは、上記のフレームワークを用いて開発されたもの。
  • JavaScriptエンジン以外にも、Groovy, Ruby, Pythonなどのスクリプトエンジンも開発されており、これらは別途scripting.dev.java.netからダウンロードできる。
ScriptEngineManager m = new ScriptEngineManager();//(1)
ScriptEngine engine = m.getEngineByName("js");//(2)
engine.eval("alert('hello, java!!!')");//(3)
  1. スクリプトエンジンマネージャを作成。ScriptEngineManagerとかScriptEngineが今回追加されたAPIのクラス
  2. getEngineByName(<スクリプトの識別子>)で、指定したスクリプト言語用のエンジンが生成できる。この例ではJavaScriptの拡張子である”js”を指定して、JavaScriptのエンジンを取得している。”javascript”を与えても良い。他にもmime-type(text/javascript)を渡す方法などがある。もしRubyのエンジンを取得したければ、”rb”または”ruby”などと指定すればよい。
  3. evalメソッドの引数に、スクリプトを文字列として渡す。この場合はJavaScriptのコードである alert(‘hello, java!!!’)を文字列として渡しているので、これを実行すればアラートが表示される。外部リソースからスクリプトのコードを読み込んで、それをevalして実行することも可能。

ちなみに以下のようなコードを書いて、これを上記のRhinoエンジンで動作させることもできる。

var fr = new javax.swing.JFrame();
fr.setSize(200,200);
fr.title = "hello java";
fr.visible = true;

このとおり、通常のJavaScriptのコードから、JavaAPIを呼び出すことができる。簡単なGUIプログラムをサッと作成したいときなどに威力を発揮しそうである。

Web Service

  • Webサービス開発関連の技術が幾つか追加された。
  • Webサービスの開発を容易にするための仕様であるJAX-WSがJavaSE6に取り込まれた(JAX-WSは元々はJavaEE5の一部であった)。
  • java-XMLバインディングの仕様であるJAXB(Java Architecture for XML Binding)2.0がJavaSE6に取り込まれた。
  • JAXPがアップートされ、新たにStAXをサポート。StAXとはDOM,SAXと同様、XMlをパーシングするための技術。SAXに似ているが、パースの方法が違う。また、XMLの生成も可能であり、DOMのようにメモリを大量に必要としないため便利。ちなみにスペックリードはBEA
JAX-WSによるWebサービスの実装
  • JAX-WSでは、アノテーションと、JAX-WSが提供するツール(wsgen,wsimport)を用いることで簡単にWebサービスを開発できる。以下に開発の簡単な流れを説明する。

Webサービスを実現するクラス(POJO)を作成する

@WebService
public class Calculator{
  @WebMethod
  public int add(int x, int y){
    return x + y;
  }
}
  • Webサービスのサーバーを実行するクラスを作成する
public class WSServer{
  public static void main(String[] args){
    Calculator calc = new Calculator();
    Endpoint.publish("http://localhost:8080/add", calc);
  }
}
  • 作成したソースを、wsgenツールに与えて実行すると、Webサービスの公開に必要なWSDL, スキーマ定義、Webサービスでやり取りするデータを格納するクラスなど、サーバー側に必要なクラスやリソースが生成される。
  • 生成されたWSDLファイルを、wsimportツールに与えると、Webサービスのプロキシクラスなど、クライアント側で必要なクラスが生成される。
  • 生成されたプロキシクラスを使って以下のようなクライアント側のコードを作成する。
public class Client{
  public static void main(…){
    CalculatorService service = new CalculatorService();//  ….(1)
    Calculator calc = service.getCalculatorPort();//………………(2)
    int result = calc.add(1,2);//………………………………………(3)
    System.out.println(result);
  }
}

(1)CalculatorService, Calculatorクラスは生成されたもの。
(2)の処理により、プロキシオブジェクト(calc)が取得できる。このオブジェクトのメソッドを実行すると、サーバー側で処理が行われ、結果を取得できる。

  • 作成したサーバーのクラスを実行すると、Webサービスのサーバーが起動する。
$ >java … WSServer
  1. 5.で作成したクライアントクラスを実行すると、Webサービスを実行できる。
$ >java … Client
$ 3

以上のように、アノテーションを使って1,2のような単純なクラスを作り、ツールを実行することで、Webサービスに必要な多くのリソースが生成される。あとは生成されたクライアント側のクラスを使ってクライアントを作成するだけであり、非常に容易にWebサービスを開発できようになる。

JDBC4.0

  • 従来から大きな変更はない。
  • Apache DerbyがJDKにバンドルされるようになった。
  • Connectionを取得する際、JavaSE6組み込みのApache Derbyを使用する場合、もしくは-Dオプションを指定しておくことにより、「Class.forName("org.apache.derby.Driver");」のような直感的でない記述が不要になった。
  • SQLXML型をサポート

デスクトップアプリケーション関連

Task Tray
  • Javaデスクトップアプリケーション(AWT, Swing)を作成する際に、ホストOSのタスクアイコンが使えるようになった。
  • Windowsのタスクバー右端のタスクトレイの領域に、Javaアプリのアイコンを表示したり、ポップアップメニューを表示したりできる。
Splash Screen Support
  • アプリ起動時のスプラッシュスクリーンを表示できるようになった。
  • 従来でも可能であったが、JVMの起動と、ライブラリのロードが完了するまで表示できなかった。SE6ではJVMの起動直後にスプラッシュスクリーンを表示できる。
Desktop Class
  • java.awt.Desktopクラスを使用することで、javaアプリからOSにインストールされているブラウザやメーラーを起動したり、wordなどOSに依存するアプリのファイルを開いたり、印刷できるようになった。
GroupLayout
  • GroupLayoutという新しいSwingのレイアウトマネージャが導入された。
  • FlowLayoutやGridBagLayoutなどよりも簡単にレイアウトを調整できる。

Monitoring and Management

  • 以下のようなモニタリング・管理のためのツールがバンドルされる
  • jconsole:Javaアプリのリソース・パフォーマンス情報を監視するためのツール。従来はアプリ起動時にJMXエージェントを一緒に起動しておく必要があったが、SE6からはエージェントが不要になり、直接アタッチできるようになった。
  • jstack:アプリのスタックフレームの情報のスナップショットを表示できるツール。メソッドの呼び出し情報、スレッドの状態などが監視できる。
  • jmap:メモリ領域の状態のスナップショットを表示するツール。
  • jhat:javaヒープダンプを解析し、Webサーバーを起動し、ヒープダンプをWebブラウザで閲覧するためのツール。

Compiler Access

  • javaコンパイラにアクセスするためのAPIが追加された
  • JSPエンジンなど、Javaコードを動的に生成するようなツールを開発する際に利用できる。(ほとんど使うことはないかもしれない)

国際化対応

  • 和暦サポート。和暦Localeの導入により、Calender#getメソッドで元号(に対応する定数)を取得できたり、DateFormatクラスで“平成19年11月17日“のような文字列を取得できるようになった。

OutOfMemoryError詳細情報の表示

  • OutOfMemoryErrorの詳細が出るようになった。アプリがOutOfMemoryErrorで落ちたときに、どの領域(Cヒープ、スタック、ヒープ領域、パーマネント領域、コードキャッシュなど)が不足しているのかが同時に表示されるようになった。
  • 例えば、アプリが落ちたときに「OutOfMemoryError: PermGen space」というメッセージが表示された場合は、javaの起動時オプションに、「-XX:MaxPermSize=NNm」を追加すればよい、などということがわかる。