2

讓我們先從這些步驟演示問題:如何在Internet Explorer中使用JavaScript創建Java對象?

  1. 打開一些網頁,加載在Internet Explorer 9的Java小程序和一個真正的瀏覽器(Firefox或Chrome)。例如,我們使用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中發生故障時,它會顯示在此錯誤消息第二行:

"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的答案。

回答

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); 
    } 
} 
+0

當然,這會起作用,但它不是一個在JavaScript中構造Java對象的通用解決方案,因爲那樣我必須在Java applet中實現東西。我的目標是在JavaScript中做所有事情。 Java applet(可以是任何applet,甚至是空的)只是用來訪問Java包。 – kayahr

+0

編輯我的答案。 –

相關問題