2009-05-19 72 views
0

我打算開發一個使用某些Java類的Firefox擴展。 擴展名使用Javascript獲取<input type="file">字段的值。從Firefox擴展的Javascript訪問Java類時遇到困難

的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[]` 

例如,把下面這行的主要方法invokation前:

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

兩個火狐-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更新13

我在哪裏錯了?它是否是Firefox-3.0.10 Javascript引擎的一個可能的錯誤,或者在獲取main(...)方法之前我是否還需要做其他事情?

回答

0

您錯誤地調用了使用的方法;

[parameters.getClass()] 

它將一個java.lang.Class []類型的參數傳遞給期望String對象的簽名。只需傳入參數對象就可以了。

+0

公共方法getMethod(字符串名稱, 類... parameterTypes) 拋出NoSuchMethodException, 拋出:SecurityException 我猜猜他是對的。 – alamar 2009-05-19 08:36:06

+0

現在我得到這個異常: InternalError:無法將JavaScript值轉換爲java.lang.Class類型的Java值[] – Giancarlo 2009-05-19 08:36:48

1

假設你完整的類名是 「your.package.Firefox」 你可以這樣做:

importPackage("your.package"); 

args = java.lang.reflect.Array.newInstance(java.lang.String.TYPE, 1); 
Firefox.main(args)