CodeZine(コードジン)

特集ページ一覧

JRubyからJavaへのアクセス方法

Javaのクラスを利用する簡易言語としてJRubyを使う方法

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/12/20 14:00

Javaのクラスを利用するためにJRubyに用意されている固有の機能を説明します。

目次

はじめに

 本稿は、JRubyに固有の特徴を説明し、JRubyをJavaのクラスを利用するための簡易な言語として使えるようにします。JRuby一般の解説については『JRubyチュートリアル』などを参照してください。本稿はJRuby 1.0.2について書かれましたが、JRuby 1.0.3にも適用できます。

対象読者

 読者は、RubyとJavaの基礎知識があると仮定します。

文字エンコーディング

 JRubyは、文字をUTF-8扱いするか、それとも1バイトずつの列として扱うか、二通りの指定が-Kオプションや$KCODEで可能です(少なくともJRuby内部で指定を受理する部分はそのように作られています)。しかし、今のところ、その指定はほとんど意味をもっていません。

 正規表現やinspectメソッドは、指定にかかわらず、文字列をつねに1バイトずつの列として扱います。getsputsなどでも文字列をバイト透過に扱いますから、バイナリ・データとして漢字やかななどの非ASCII文字を扱うことはできます。

 さらに重要なこととして、指定にかかわらず、Javaとの相互作用では、Rubyの文字列はつねにUTF-8であると仮定されます。

include Java
java.lang.System.out.println("あ")

 このコードは、UTF-8で書かれているときに限り、Javaに正しく「あ」というUnicode文字を渡します。Javaは、渡された「あ」をプラットフォームのデフォルト文字エンコーディング(例えばShift_JIS)で印字します。

 現状ではJRubyのプログラムはUTF-8で記述するのが妥当です。

標準Javaライブラリへのアクセス

 下記によって標準Javaライブラリへのアクセスが可能になります。旧バージョン以来の方法もありますが、今はこの簡潔な方法で十分です。

include Java

 例えば、UTF-8で下記のスクリプトを作成し、

include Java

frame = javax.swing.JFrame.new("窓の例")
label = javax.swing.JLabel.new("こんにちは")
frame.getContentPane.add(label)
frame.setDefaultCloseOperation(javax.swing.JFrame::EXIT_ON_CLOSE)
frame.pack
frame.setVisible(true)

 JRubyで実行すると、このようなウィンドウが表示されます:

 

 ここでjavax.swing.JFrameという表現が何かRuby言語の範囲外の魔法に見えるかもしれません。しかし、実際には完全に正当なRuby式です。上記をメソッド呼出しの丸括弧を省略しないで書くとこうなります。

include(Java)

frame = javax().swing().JFrame().new("窓の例")
label = javax().swing().JLabel().new("こんにちは")
frame.getContentPane().add(label)
frame.setDefaultCloseOperation(javax().swing().JFrame()::EXIT_ON_CLOSE)
frame.pack()
frame.setVisible(true)

 つまり、定数JavaEXIT_ON_CLOSE、それからローカル変数framelabelを除き、このプログラムにある識別子は実はすべてメソッド名です。このように"魔法を解いた"かたちにすればすぐに分かることですが、長々しくjavax.swing.JFrameなどと繰り返し書くのが面倒ならば、

include Java

swing = javax.swing
JFrame = swing.JFrame

frame = JFrame.new("窓の例")
label = swing.JLabel.new("こんにちは")
frame.getContentPane.add(label)
frame.setDefaultCloseOperation(JFrame::EXIT_ON_CLOSE)
frame.pack
frame.setVisible(true)

 のようにJavaのパッケージ名やクラス名(のように見えるRubyのメソッド呼出しの戻り値)を変数や定数に代入して、それを使い回せば十分です。

別のアクセス方法
 普通のRubyモジュールと同じく、include Javaをせずに二重コロン記法を使ってJava::javax.swing.JFrameのようにアクセスすることもできます。後述するように、実はこの記法の方が汎用性があります。

  • LINEで送る
  • このエントリーをはてなブックマークに追加

修正履歴

  • 2011/03/18 15:34 沖ソフトウェアの URL を変更しました。

  • 2011/03/18 15:34 沖ソフトウェアの URL を変更しました。

  • 2007/12/23 07:53 誤字を訂正しました。 JRuby 1.0.3への適用を追記しました。

著者プロフィール

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5