IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

NoClassDefFoundError avec loadClass et method.invok(Object obj, Object args)


Sujet :

Langage Java

  1. #1
    Membre actif Avatar de snoop
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 354
    Points : 294
    Points
    294
    Par défaut NoClassDefFoundError avec loadClass et method.invok(Object obj, Object args)
    Bonjour,
    Donc, j'utilise les méthodes loadClass, getMethod et Method.invok(Object obj, Object args) pour charger des classes et lancer des méthodes. Tout marche correctement quand toutes mes classes invokées sont dans le même package.
    Le problème c'est quand je veux exécuter une méthode d'une classe du package qui fait appel à une autre classe située dans une autre package, dans ce cas j'ai une erreur de type NoClassDefFoundError :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    java.lang.reflect.InvocationTargetException
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at com.monpackage.installer.InstallCom.completeInstall(InstallHandlerPython.java:65)
    	at org.eclipse.update.internal.core.InstallHandlerProxy.completeInstall(InstallHandlerProxy.java:227)
    	at org.eclipse.update.core.Feature.install(Feature.java:507)
    	at org.eclipse.update.internal.core.SiteFile.install(SiteFile.java:96)
    	at org.eclipse.update.internal.core.ConfiguredSite.install(ConfiguredSite.java:155)
    	at org.eclipse.update.internal.core.ConfiguredSite.install(ConfiguredSite.java:119)
    	at org.eclipse.update.internal.operations.InstallOperation.execute(InstallOperation.java:92)
    	at org.eclipse.update.internal.operations.BatchInstallOperation.execute(BatchInstallOperation.java:84)
    	at org.eclipse.update.internal.ui.wizards.InstallWizard2.install(InstallWizard2.java:375)
    	at org.eclipse.update.internal.ui.wizards.InstallWizard2.access$1(InstallWizard2.java:372)
    	at org.eclipse.update.internal.ui.wizards.InstallWizard2$1.run(InstallWizard2.java:485)
    	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:58)
    Caused by: java.lang.NoClassDefFoundError: com/monpackage/installer/implement/InstallerComplete
    	at com.monpackage.installer.InstallerFact.newInstaller(InstallerFactory.java:27)
    	... 16 more
    Root exception:
    java.lang.NoClassDefFoundError: com/monpackage/installer/implement/InstallerComplete
    	at com.monpackage.installer.InstallerFact.newInstaller(InstallerFactory.java:27)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at
    Donc, y-a-t-il moyen de contourner ce problème ou non ?

    Merci
    Snoop

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Je ne connais pas loadClass, j'utilise Class.forName("package.nomClasse") pour charger une classe dynamiquement et je n'ai jamais eu de problème pour charger une classe d'un autre package (il ne manquerait plus que ça )

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre actif Avatar de snoop
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 354
    Points : 294
    Points
    294
    Par défaut
    En fait, je charge une classe d'un package A et invoke la méthode X de cette classe et cette méthode X instancie une nouvelle classe située dans un package B.
    Petite précision aussi : c'est dans le cadre d'un développement de plugin pour Eclipse....

    Si quelqu'un a déjà connu ce genre de problème...
    Snoop

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Si l'objet est visible, il ne devrait pas y avoir de problème...
    Peux-tu montrer le code ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre actif Avatar de snoop
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 354
    Points : 294
    Points
    294
    Par défaut
    Dans la classe qui effectue les load des classes et methodes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Class installerFact = plug.loadClass("com.monpackage.installer.InstallerFact");
    Class[] params = { Integer.class, Integer.class };
    Method meth = installerFact.getMethod("newInstaller", params);
    Object installer = null;
    Object[] args = new Object[] { 1, 2 };
    installer = meth.invoke(null, args);
    Class[] paramTypes = { String.class, String.class, String.class };
    Method meth1 = installer.getClass().getMethod("installPlugin", paramTypes);
    Object[] arg = new Object[] { pathFile, id, version };
    meth1.invoke(installer, arg);
    Dans la classe InstallerFact où je fais appel à la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public static InstallerComplete newInstaller(){
       return new InstallerComplete();
    }
    InstallerComplete est une classe située dans un autre package et où je veux exécuter la méthode installPlugin.
    Snoop

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Oui, mais je présume qu'il te faut une instance d'objet pour le faire (ce n'est pas une méthode statique), or ta méthode invoke(null,...) ne se base pas sur une instance d'objet...
    Je pense qu'il faut passer par une instance de A pour appeler la méthode qui créée l'objet B
    Class.forName("class_de_A").newInstance()
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre actif Avatar de snoop
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 354
    Points : 294
    Points
    294
    Par défaut
    La méthode newInstaller() est static...
    Snoop

Discussions similaires

  1. [Reflection] Impossible de transmettre une valeur null avec method.invoke
    Par touftouf57 dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 02/07/2010, 03h42
  2. Method invoke avec List<generics>
    Par youx21 dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2007, 09h11
  3. Réponses: 35
    Dernier message: 21/03/2007, 10h36
  4. [Reflexivite]exception ArrayIndexOutOfBoundsException methode invoke
    Par caro_a dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 12/07/2006, 11h35
  5. Problème avec une generic method
    Par Pragmateek dans le forum Langage
    Réponses: 15
    Dernier message: 24/05/2006, 19h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo