2009-05-19 4 views
0

Je vais développer une extension Firefox qui utilise des classes Java. L'extension obtient la valeur de <input type="file"> champs, en utilisant Javascript.Problème d'accès aux classes Java depuis l'extension Firefox de Firefox

La classe Java Je vais créer est la suivante:

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

Javascript, je dois utiliser la réflexion Java pour accéder aux classes Java.

De cette manière, je peux créer mon objet 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 

J'ai essayé cette extension sur Firefox 3.5b4-et tout va bien, mais quand je l'essayer sur Firefox-3.0.10 I obtenir l'exception suivante *:

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

Par exemple, mettre la ligne suivante avant la principale méthode invokation:

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

sur les deux Firefox 3.0.10 et-3.5b4 je reçois une fenêtre d'alerte qui dit:

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

Mais seulement 3.0.10 je reçois l'exception, seulement sur ma machine GNU/Linux. Sur Windows XP, je n'ai aucun problème sur les deux versions de Firefox!

Notez que sur Windows et Linux, la version plug-in Java est 6 update 13.

Où suis-je tort? Est-ce un bug possible sur Firefox-3.0.10 Javascript ou devrais-je faire autre chose avant d'obtenir la méthode principale (...)?

Répondre

0

vous utilisez incorrectement la méthode en utilisant;

[parameters.getClass()] 

qui passe un argument de type java.lang.Class [] dans la signature qui attend un objet String. transmettez simplement l'objet paramètres tel qu'il est.

+0

publique Méthode getMethod (String name, classe ... parameterTypes) lancers francs NoSuchMethodException, SecurityException I Je suppose qu'il a raison. – alamar

+0

maintenant je reçois cette exception: InternalError: Impossible de convertir la valeur JavaScript en valeur Java de type java.lang.Class [] – Giancarlo

+0

essayez de modifier les deux lignes réfléchissantes en; var aStaticMethod = aClass.getMethod ("principal", paramètres.getClass()); // obtient la méthode principale (String [] args), ici, j'obtiens l'exception * var myJava = aStaticMethod.invoke (null, parameters); en supprimant les initialiseurs [] car ils semblent déjà avoir été créés par l'appel de réflexion. – simon622

1

en supposant que votre nom complet de la classe est "your.package.Firefox" vous pouvez faire:

importPackage("your.package"); 

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

Comment définir la valeur "args"? – Giancarlo

+0

ReferenceError: importPackage n'est pas défini – Giancarlo

+0

dans "plain" rhino cela est censé fonctionner désolé :( – dfa