2011-06-27 18 views
4

私は、javax.script。*パッケージを実際に大量に使用するプロジェクトに取り組んでいます。 Invocable.getInterfaceを使用してJavaインターフェイスを実装するJavaScriptオブジェクトを作成するのと同じように、抽象Javaクラスを拡張するJavaScriptオブジェクトを作成したいという状況があります。これは可能ですか?そしてもしそうなら、あなたはどうやってそれをしますか?JavaScriptから抽象Javaクラスを拡張できますか?

答えて

0

実行時にバイトコードを生成するルート(以下のようにBCELを使用)を実行したい場合を除いて、いいえ。 proxy classesを使用してインターフェイスで行うことはできますが、抽象クラスには同等のものはありません。

あなたが本当にBCELを試してみたい場合は、あなたの最善の戦略は、これを行うことです。

  1. は、すべての抽象クラスとデリゲートを拡張する新しいクラスのバイトコードのbyte[]を生成するためにBCELを使用する方法を書きますJavaScriptへの抽象メソッド。
  2. 抽象クラスをラッパーに関連付ける命名規則を定義します。 foo.MyAbstractClassfoo.MyAbstractClassDynamicLangWrapperに対応します。
  3. ロールクラスのバイトを命名規則ことを認識すると、生成するfindClassを実装し、
  4. defineClassがあなたのスクリプト言語は、スクリプト内のクラス名を解決するために、カスタムクラスローダを使用していることを確認してください呼び出しますClassLoader。私はRhinoでsetApplicationClassLoaderを使用していると思いますが、わかりません。
+0

これは厄介なようです。私は別の解決策を思いつくと思います。 –

2

はい、可能です。以前のポスターは間違っています。 documentation for JavaAdapterを参照してください。

+0

残念ながら、私は、基礎となるRhinoオブジェクトをすべて公開しないjavax.script名前空間に組み込みのものを使用しています。私の質問はその状況に特有のものでしたが、これはまだまだ有用な答えです。 –

+0

実際には、これはJavaScript側で公開されており、javax.scriptでも動作するはずです –

+0

重要な注意:JavaAdapterの「ドキュメント」はジョークです。リンクされたページに段落があり、ネット周辺のいくつかのサイトが生成されていますJavaDocは文字通り解説は全くありません。 :( また、マイケルが指摘するように、あなたは*できます*あなたのJavascriptコードでは、新しいJavaAdapter(MyJavaClass、{myOverloadedFunc:function(a、b){return a + b; }) '、' Context.jsToJava'を使って 'MyJavaClass'にキャストできます(実際には* docsを持っています) – Coderer

関連する問題