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

Java Discussion :

Problème lors de l'instantiation d'une classe : java.lang.ClassCastException


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Points : 20
    Points
    20
    Par défaut Problème lors de l'instantiation d'une classe : java.lang.ClassCastException
    Bonjour à tous,

    J'essaie de créer une instance d'une classe qui n'est pas dans le classpath, chargée avec URLClassLoader, et d'utiliser ses méthodes.
    Mais j'ai une erreur que je n'arrive pas à corriger. J'ai essayé de chercher sur internet mais sans résultat ! C'est un domaine qui est encore nouveau pour moi, alors désolé si l'erreur est évidente



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     public static void main(String[] args) {
        	try {
        		URL[] urls = new URL[1];
        		urls[0] = new File("D:\\JavaWorspace\\test").toURI().toURL();
        		URLClassLoader classloader = new URLClassLoader(urls);
        		Class c=classloader.loadClass("test");
        		truc t=(truc) c.newInstance();
        		System.out.println(t.getNumber());
        	} catch (Exception e) {
    			e.printStackTrace();
    		}
        }
    j'ai ma classe test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class test implements truc{
    	public int getNumber(){
    		return 2;
    	}
    }
    et l'interface truc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface truc {
    	public int getNumber();
    }
    et j'obtiens toujours comme erreur (la ligne 15 c'est la 8ème sur le code en haut)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    java.lang.ClassCastException: test cannot be cast to truc
    	at Main.main(Main.java:15)
    j'ai cherché à quoi cela correspondait, mais je n'ai pas trouvé encore. Vous pouvez m'éclairer?

    merci !!

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 281
    Points : 321
    Points
    321
    Par défaut
    Tu n'as pas besoin de caster l'object de classe test puisque les test sont des truc. remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    truc t=(truc) c.newInstance();
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    truc t=c.newInstance();
    Je pense que ça ira.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    (désolé pour les noms bizarre des mes classes ^^)

    merci pour te réponse !
    Non ça ne marche pas, il y a une erreur de compilation, c'est obligé de laissé (truc) c.newInstance();

    Je précise aussi que la classe test ne se trouve pas dans le classpath, mais ailleurs sur le disque, des fois que l'erreur serait lié à ça... ?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 619
    Points
    21 619
    Par défaut
    Je confirme que le cast est obligatoire, vu que newInstance() renvoie un Object .

    Pour l'erreur, je ne sais pas, je commencerais pas vérifier les noms qualifiés.

    Voir ce que donnent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(truc.class.getCanonicalName());
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(Class<?> interf : c.getIntefaces()) {
      System.out.println(interf.getCanonicalName());
    }
    Si ça ne donne pas la même chose, il y a un problème quelque part avec les packages.

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    J'ai l'impression que tu combine deux erreurs:

    1) "truc" est présent à la fois dans ton classpath principal (ton application) et dans ton urlclassloader. Seul test devrais être dans le urlclassloader, donc nettoyer
    2) le urlclassloader est liée par défaut au bootstrap et non pas au classloader de ton application, ce qui le rend indépendant du "truc" de ton application.

    Bref que tu aurais ce shema:
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bootstrap
       application
         Class<truc>
       urlClassloader
         Class<truc>
         Class<test>
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    bootstrap
       application
         Class<truc>
         urlClassloader
           Class<test>
    Pour corriger la deuxième partie, utiliser ce code après avoir nettoyé le test en trop:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     public static void main(String[] args) {
        	try {
        		URL[] urls = new URL[1];
        		urls[0] = new File("D:\\JavaWorspace\\test").toURI().toURL();
        		URLClassLoader classloader = new URLClassLoader(urls,truc.class.getClassLoader());
        		Class c=classloader.loadClass("test");
        		truc t=(truc) c.newInstance();
        		System.out.println(t.getNumber());
        	} catch (Exception e) {
    			e.printStackTrace();
    		}
        }
    PS: les noms de classe et interface, en java, toujours commencer par une majuscule.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    j'ai essayé d'utiliser le code que vous m'avez corrigé, mais ça ne fonctionnait toujours pas ^^

    finalement, j'ai trouvé autre chose qui marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     public static void main(String[] args) {
        	try {
        		URL[] urls = new URL[1];
        		urls[0] = new File("D:\\JavaWorspace\\test").toURI().toURL();
        		URLClassLoader classloader = new URLClassLoader(urls,truc.class.getClassLoader());
        		Class c=classloader.loadClass("test");
        		Method m=c.getMethod("getNumber",null);
        		System.out.println(m.invoke(c.newInstance(),null));
        	} catch (Exception e) {
    			e.printStackTrace();
    		}
        }
    en tout cas merci pour vos commentaires !

  7. #7
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Ton erreur laisse supposer que la JVM ne reconnait pas la classe "test" comme etant fille/implementation de truc. Visiblement, elle considere que l'interface "truc" de ton programme et celle qui a été utilisée pour generer ton package test sont différentes.

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 619
    Points
    21 619
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    Ton erreur laisse supposer que la JVM ne reconnait pas la classe "test" comme etant fille/implementation de truc. Visiblement, elle considere que l'interface "truc" de ton programme et celle qui a été utilisée pour generer ton package test sont différentes.
    Et nous noterons au passage que faire ce que j'ai demandé aurait sans doute permis de le détecter. Mais j'ai pas eu de nouvelle.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème lors de la compilation d'une classe
    Par gjava dans le forum JavaFX
    Réponses: 1
    Dernier message: 09/10/2012, 01h04
  2. instantiation d'une classe problème DOM
    Par bobdruyd dans le forum C#
    Réponses: 0
    Dernier message: 17/09/2009, 01h43
  3. Réponses: 5
    Dernier message: 10/07/2007, 17h20
  4. Réponses: 3
    Dernier message: 09/04/2006, 13h04
  5. Problème lors d'un Update sur une date
    Par Nany dans le forum ASP
    Réponses: 3
    Dernier message: 19/05/2004, 22h37

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