javacriptとjavaをつなぐbridgeクラスはpublicで定義せよ - javaFX
2013/03/27
java
javafx
とてもはまったこと。
JavaFXです。WebView周りです。
なににはまったかというと、下記のようなコードがありまして、これはjavascriptからユーザが定義したJavaのクラスを呼べるよというものです。
で、このネタは、javadoc WebEngine (JavaFX 2.2)public class JavaApplication { public void exit() { Platform.exit(); } }
JSObject window = (JSObject) webEngine.executeScript("window"); window.setMember("app", new JavaApplication());
なのですが、僕はこれを、たとえばなのですが、
としてインナークラスとして定義して使っていたわけです。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で定義されてはいますが、そうしなくても、動いていたものが動かなくなると、あせります。一瞬逃亡しようかと思うぐらい。
しかし、リリースノートみればわかるんですかね。こういうのって。
: