0

いくつかの Java クラスを使用する Firefox 拡張機能を開発する予定です。拡張機能は、<input type="file"> Javascript を使用してフィールドの値を取得します。

作成する Java クラスは次のとおりです。

public class Firefox {
    public static String inFileName;
    public static void main(String[] args) throws IOException {
        inFileName = "";
        try {
            inFileName = args[0];
        } catch (Exception ex) {}
}

Javascript では、Java クラスにアクセスするために Java リフレクションを使用する必要があります。

このようにして、Java オブジェクトを作成できます。

var fileInput = e.explicitOriginalTarget; // is an object HTMLInputElement, I get this when a file is selected
strArray = java.lang.reflect.Array.newInstance(java.lang.Class.forName("java.net.URL"),3);
classLoader = java.net.URLClassLoader.newInstance(strArray);
parameters = java.lang.reflect.Array.newInstance(java.lang.Class.forName("java.lang.String"),1);
parameters[0]= fileInput.value;
var aClass = java.lang.Class.forName("Firefox", true, classLoader);
var aStaticMethod = aClass.getMethod("main", [parameters.getClass()]); //gets the main(String[] args) method, here I get the exception*
var myJava = aStaticMethod.invoke(null, [parameters]); //invokes the main method

この拡張機能を Firefox-3.5b4 で試してみましたが、すべて問題なく動作しましたが、Firefox-3.0.10 で試してみると、次の例外が発生しました*:

`InternalError: Unable to convert JavaScript value class [Ljava.lang.String; to Java value of type java.lang.Class[]`

たとえば、次の行をメイン メソッド呼び出しの前に置きます。

alert(parameters + "  -  " + parameters[0]);

Firefox-3.0.10 と 3.5b4 の両方で、次の警告ウィンドウが表示されます。

`[Ljava.lang.String;@194ca6c  -  /root/demo.pdf`  //demo.pdf is the selected file

しかし、3.0.10 でのみ、GNU/Linux マシンでのみ例外が発生します。代わりに Windows XP では、両方の Firefox バージョンで問題はありません!

Windows と Linux の両方で、Java プラグインのバージョンは 6 update 13 であることに注意してください。

どこが間違っていますか?Firefox-3.0.10 Javascript エンジンのバグの可能性がありますか、それとも main(...) メソッドを取得する前に何か他のことをしなければなりませんか?

4

2 に答える 2

1

完全なクラス名が「your.package.Firefox」であると仮定すると、次のことができます。

importPackage("your.package");

args = java.lang.reflect.Array.newInstance(java.lang.String.TYPE, 1);
Firefox.main(args)
于 2009-05-19T08:36:57.037 に答える
0

を使用してメソッドを誤って呼び出しています。

[parameters.getClass()]

これは、タイプ java.lang.Class[] の引数を String オブジェクトを予期している署名に渡しています。パラメーター オブジェクトをそのまま渡すだけです。

于 2009-05-19T08:34:04.907 に答える