プログラマメモ2 - programmer no memo2

javacriptとjavaをつなぐbridgeクラスはpublicで定義せよ - javaFX 2013/03/27

とてもはまったこと。
JavaFXです。WebView周りです。

なににはまったかというと、下記のようなコードがありまして、これはjavascriptからユーザが定義したJavaのクラスを呼べるよというものです。


public class JavaApplication {
    public void exit() {
        Platform.exit();
    }
}

JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("app", new JavaApplication());
で、このネタは、javadoc WebEngine (JavaFX 2.2)
 なのですが、僕はこれを、たとえばなのですが、


class JavaApplication {
    public void exit() {
        Platform.exit();
    }
}
としてインナークラスとして定義して使っていたわけです。
で、これで問題はなく動いてました。

つい先月、java周りでいろいろセキュリティ関連の問題の対処だと思うですが、アップデートがあって、それで更新したら、案の定動かなくなっていたのでした。

まあ、正直いうとコンパイルが通らなくて、JObjectを、netscape.javascript.JSObjectではなく、com.sun.webpane.webkit.dom.JSObjectを直接使っていたからなのでコンパイルが通らなかった。現時点でも内部の実装は、com.sun.webpane.webkit.dom.JSObjectのようですが。

で呼び出し netscape.javascript.JSObjectにして、動かすと動かない。

Communicating between JavaScript and JavaFX with WebEngine (The JavaFX Blog)

コンパイルは通るけど、動かないどうも定義したクラスが呼ばれないような動きをしていたのでした。
 いろいろ調べていたら、まあ、ありました。

2.2.5からブリッジするJavaクラスはpublicでないといけないようです。
たしかに、publicにしたら動きました。動いたのできっとこのコメントは正しいのでしょう。たぶん。

 javadocのサンプルコードもたしかにpublicで定義されてはいますが、そうしなくても、動いていたものが動かなくなると、あせります。一瞬逃亡しようかと思うぐらい。

 しかし、リリースノートみればわかるんですかね。こういうのって。





: