2

次の手順で問題を示すことから始めましょう。

  1. Internet Explorer 9 と実際のブラウザー (Firefox または Chrome) で Java アプレットをロードする Web ページを開きます。たとえば、http://javatester.org/version.htmlを使用してみましょう。

  2. JavaScript コンソールで次のコードを実行します。

    j = document.applets[0].Packages;
    image = new j.java.awt.image.BufferedImage(256, 256, 2);
    image.getWidth();
    

これは Firefox と Chrome で機能し、正しい画像幅 256 を出力します。ただし、Internet Explorer では失敗し、2 行目に次のエラー メッセージが表示されます。

"java.lang.IllegalArgumentException: No method found matching name java.awt.image.BufferedImage and arguments []" 

これが失敗する理由は何ですか?デフォルトのコンストラクターを持つ他の Java クラスをインスタンス化することができました。したがって、このコードは正しく機能します。

new j.java.util.Random().nextInt()

では、Internet Explorer または Java プラグインには、コンストラクターに引数を渡すバグがあるのでしょうか? エラー メッセージは、IE が引数なしでコンストラクターを呼び出そうとしているように聞こえます (そして、BufferedImage には既定のコンストラクターがありません)。

この問題を理解したり、修正したり、回避策を見つけたりするのに役立つ情報 (おそらく既存のバグ レポート) に興味があります。この質問は、JavaScript からの Java オブジェクトのインスタンス化に関するものであり、画像の作成方法に関するものではないことに注意してください。したがって、Canvas の使用に関する回答はご遠慮ください。

4

1 に答える 1

1

あなたのコードは正しいようです。IEが失敗する理由がわかりません。

回避策は、実行している機能の一部を実行するアダプターをJavaで作成することです。次に、このアダプターコードをjavascriptから呼び出します。

編集

より一般的にするには、リフレクションを使用してクラスをインスタンス化するJavaクラスでこのようなメソッドを作成します。私はこのコードをテストしていません。

public Object instantiate(String className, Object... params) throws NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException {
    Class cls = Class.forName(className);
    List<Class> paramClasses = new ArrayList();
    for (Object p : params) {
        paramClasses.add(p.getClass());
    }
    if (params.length == 0) {
        Constructor constructor = cls.getConstructor();
        return constructor.newInstance();
    }
    else {
        Constructor constructor = cls.getConstructor(paramClasses.toArray(new Class[paramClasses.size()]));
        return constructor.newInstance(params);
    }
}
于 2012-10-05T15:02:31.153 に答える