Я собираюсь разработать расширение Firefox, которое использует некоторые классы Java.
Расширение получает значение <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 обновление 13.
Где я не прав? Это возможная ошибка в движке Firefox-3.0.10 Javascript или я должен сделать что-то еще до получения метода main (...)?