[newInstance()] ClassCastException incompréhensible
Bonjour,
J'ai un petit problème. J'ai un code java qui doit chercher les class implémentant une certaine interface; une fois trouvé, il faut instancier cette class et l'utiliser via l'interface qu'elle implémante.
Voici le code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
try {
//tmp_class = Class.forName(tmp_string, true, loader);
tmp_class=Class.forName(tmp_string);
for(int j=0; j<tmp_class.getInterfaces().length; j ++ ) {
if(tmp_class.getInterfaces()[j].getName().toString().equals(PluginBase.class.getName()) ) {
System.out.println("TROUVEEEEEEE: "+tmp_string);
//allPluginsBase.add((PluginBase)tmp_class.newInstance());
PluginBase base;
base=(PluginBase)tmp_class.newInstance();
System.out.println("HHH="+base.getName());
break;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} |
Le problème se trouve à cette ligne:
Code:
base=(PluginBase)tmp_class.newInstance();
Pour plus d'explication: je suis dans JBoss, c'est une Servlet qui exécute le code ci-dessus (enfin, un objet qui a été créé dans une servlet). Les class cherchée sont copié alors que l'application est déjà déployée (mais, pas de classdefnotfound donc... pas de problème; de plus, j'ai redémarrer le serveur d'application: aucun changement donc le problème ne provient pas de la).
Voici l'erreur exacte:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 16:54:07,837 INFO [STDOUT] IL Y A 2 fichier class
16:54:07,885 INFO [STDOUT] A= /home/loopx/workspace/workspace_PiX-Mania/base/outils/jboss-4.2.2.GA/server/default/deploy/PiX-MANIA.ear/lib_plugin_installed.jar/be/loopx/pixmania/helloworld/HelloServlet.class
16:54:07,886 INFO [STDOUT] B= /home/loopx/workspace/workspace_PiX-Mania/base/outils/jboss-4.2.2.GA/server/default/deploy/PiX-MANIA.ear/lib_plugin_installed.jar/be/loopx/pixmania/helloworld/HelloServlet
16:54:07,887 INFO [STDOUT] C= be.loopx.pixmania.helloworld.HelloServlet
16:54:07,894 INFO [STDOUT] A= /home/loopx/workspace/workspace_PiX-Mania/base/outils/jboss-4.2.2.GA/server/default/deploy/PiX-MANIA.ear/lib_plugin_installed.jar/be/loopx/pixmania/helloworld/HelloWorldPlugin.class
16:54:07,895 INFO [STDOUT] B= /home/loopx/workspace/workspace_PiX-Mania/base/outils/jboss-4.2.2.GA/server/default/deploy/PiX-MANIA.ear/lib_plugin_installed.jar/be/loopx/pixmania/helloworld/HelloWorldPlugin
16:54:07,896 INFO [STDOUT] C= be.loopx.pixmania.helloworld.HelloWorldPlugin
16:54:07,902 INFO [STDOUT] TROUVEEEEEEE: be.loopx.pixmania.helloworld.HelloWorldPlugin
16:54:07,903 ERROR [[PluginServlet]] "Servlet.service()" pour la servlet PluginServlet a lancé une exception
java.lang.ClassCastException: be.loopx.pixmania.helloworld.HelloWorldPlugin
at be.loopx.pixmania.plugin.PluginLoader.loadAllPluginBase(PluginLoader.java:100)
at be.loopx.pixmania.servlet.PluginServlet.processRequest(PluginServlet.java:83)
at be.loopx.pixmania.servlet.PluginServlet.doGet(PluginServlet.java:46)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:445)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292)
at be.loopx.pixmania.servlet.ControlServlet.gotoPluginServlet(ControlServlet.java:217) |
Comme vous pouvez le constater, une des deux class présente contient bien une implémentation de l'interface. Donc, je ne comprend pas pourquoi ce classcastexception apparait.
Voici le code de l'interface et de la class que j'essaie d'instancier:
interface "PluginBase.java"
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
//by loopx
//17/01/08
//define method which need to be implemented to become a plugin
package be.loopx.pixmania.plugin;
public interface PluginBase {
public String getName();
public String getVersion();
public String getServletName();
public String getServletRelativeContext();
public void quickreminderProcess();
public void warningProcess();
public void mainProcess();
} |
class "HelloWorldPlugin.java"
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
package be.loopx.pixmania.helloworld;
import be.loopx.pixmania.plugin.PluginBase;
public class HelloWorldPlugin implements PluginBase {
public String getName() {
return "Hello world";
}
public String getServletName() {
return HelloServlet.class.getName();
}
public String getServletRelativeContext() {
return "helloworld";
}
public String getVersion() {
return "0.1";
}
public void mainProcess() {
System.out.println(this.getClass().getName()+"> MAIN PROCESS!!!");
}
public void quickreminderProcess() {
// TODO Auto-generated method stub
}
public void warningProcess() {
// TODO Auto-generated method stub
}
} |