LS2J の特徴とか:

 ・Java Agent でゴリゴリ書かなくてすむ。

    API の一ライブラリを使いたい場合に便利。

 ・C API 経由で API 呼び出ししているそうで。

    (Declarelations) に uselsx "*javacon" で、外部 LSX を呼び出します。

    外部参照させるための AIX の設定に癖があるんだなぁ、これが。

 ・Public 属性しかアクセスできない。

    自身の private が触れない…。(そういう時は大概設計がまずいんですけどね)

    普通に考えれば、外部 API 呼び出しで private なんか触らないし。

 ・呼び出し方に癖がありまくり。

    JNI Signature とかなんなんですか。

    Java が native code 呼び出すために必要なのはわかるんですけど、LotusScript と相まって大変なことになってます。

    とっつきにくさは、初めて外部 C API を VB から触ったときの、byval &h0 とかに似てますかね。

    (最初はおまじないとしか覚えられなかった…)


使い方とか:

 ・JavaSession - NotesSession と考えて使えば問題なし。コンストラクタの引数として山のように引数出ますけど、コマンドライン経由でしか使わないらしいので、通常は new JavaSession() で。

 ・JavaClass - JDK のパッケージ、ライブラリを引数に指定して、ライブラリを Script で扱えるようにするクラス。JavaSession.GetClass(<ライブラリ名>) で指定。ライブラリの階層に、通常のドット表記とスラッシュ表記の2つが指定できる。クロスプラットフォーム (Mac を含む場合) での階層指定はスラッシュ表記じゃないと NG.

 ・JavaObject - なぜか lsx の type-ahead に出てこない憎いヤツ。JavaClass でパッケージ内のクラスメソッドが利用可能になるので、メソッドから返されるオブジェクトを格納する場合に利用する。オブジェクトなら何でも突っ込めるみたい。


サンプルとか。

正規表現を使って、ASCII 以外を弾いてる (= DBCS を含むかどうか) を検出します。

Private Function hasDBCS(item As Variant) As Boolean
Dim jSession As JAVASESSION
Dim jClass As JAVACLASS
Dim jPattern As JavaObject 'なぜか lsx リストに出てこない
Dim jMatcher As JavaObject

Dim concatFullName As String

Set jSession = New JAVASESSION()
Set jClass = jSession.GetClass("java/util/regex/Pattern")
Set jPattern = jClass.compile(REGEXP_ALLHALF_CHAR)

concatFullName = Implode(item, STRING_CONCAT_TOKEN)
Set jMatcher = jPattern.matcher(concatFullName)
hasDBCS = jMatcher.find()
End Function


ヘルプだと JavaClass に必ずコンストラクタがあること前提の書き方だったので、まったく理解できず。

util にコンストラクタって発想ないし。

JNI まで引っ張り出してきて、手がつけられなくなり始めたので、中島さんブログ参考にしました。


ヘルプにポリモーフィズムメソッドなんかがある場合、JavaMethod 使えって書いてあったけど、どうなんだろ。