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 :

Pourquoi utiliser Class.forName().newInstance()


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2006
    Messages : 194
    Points : 69
    Points
    69
    Par défaut Pourquoi utiliser Class.forName().newInstance()
    Bonjour,
    En faite je veux savoir quand est ce qu'on doit utiliser Class.forName("com.bean.ClasseA").newInstance() ou lieu de faire directement new com.bean.ClasseA();
    Personnelement je trouve pas une difference!!De plus j'ai remarqué que dans certains codes java l'utilisation de Class.forName est utilisée dans des classes abstraites??
    Merci pour la clarification.

  2. #2
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par menzlitsh
    Bonjour,
    En faite je veux savoir quand est ce qu'on doit utiliser Class.forName("com.bean.ClasseA").newInstance() ou lieu de faire directement new com.bean.ClasseA();
    Personnelement je trouve pas une difference!!De plus j'ai remarqué que dans certains codes java l'utilisation de Class.forName est utilisée dans des classes abstraites??
    Merci pour la clarification.
    C'est sûr si tu as accès à ClasseA, il vaut mieux faire un new ClasseA().
    En revanche, tu n'y as pas forcément accès.
    Par exemple, dans un système de plug-ins, les classes que tu veux instancier dans ton "chargeur de plugins" ne sont pas connus à la compilation (puisque ce sont des classes d'un plugin, par définition).
    Donc il faut que tu récupères le nom de la classe à charger d'une manière ou d'une autre, et que tu l'instancies...

    Il y a beaucoup d'autres cas où c'est utile, mais l'exemple du plugin doit bien l'illustrer...

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2006
    Messages : 194
    Points : 69
    Points
    69
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Par exemple, dans un système de plug-ins, les classes que tu veux instancier dans ton "chargeur de plugins" ne sont pas connus à la compilation
    Dans mon application par exemple j'ai une classe Metier "soit disant une classe main" dans laquelle je dois faire appelle à la classe ClasseA qui ce trouve dans un jar que je viens d'ajouter dans la classepath de mon application.
    Normalement il me suffit d'instancier cette classe "ClasseA" dans la
    classe metier, donc pourquoi je dois l'instancier avec Class.forName??
    Autre chose, l'utilisation du JDBC dans un classe java necissite l'utilisation de class.forName pour l'instanciation du driver, comment vous expliquez ca??
    Merci pour la clarification

  4. #4
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par menzlitsh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Par exemple, dans un système de plug-ins, les classes que tu veux instancier dans ton "chargeur de plugins" ne sont pas connus à la compilation
    Dans mon application par exemple j'ai une classe Metier "soit disant une classe main" dans laquelle je dois faire appelle à la classe ClasseA qui ce trouve dans un jar que je viens d'ajouter dans la classepath de mon application.
    Normalement il me suffit d'instancier cette classe "ClasseA" dans la
    classe metier, donc pourquoi je dois l'instancier avec Class.forName??
    Qui a dit que tu devais?

    Citation Envoyé par menzlitsh
    Autre chose, l'utilisation du JDBC dans un classe java necissite l'utilisation de class.forName pour l'instanciation du driver, comment vous expliquez ca??
    Parce que l'initialisation (ici pas l'instanciation, car on ne fait pas de newInstance) de la classe charge tout ce qui est static... Ce qui concerne le chargement du driver...

    Mais je crois que maintenant ça n'est plus nécessaire le Class.forName(). Je ne saurais te dire ce qu'il faut utiliser à la place par contre (ou si on peut simplement le supprimer?).

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par ®om
    Qui a dit que tu devais?
    +1
    L'API de reflection permet dans ce cas là un code plus générique : le nom de la classe pourrait venir d'un fichier de configuration, et il suffirait de modifier cette valeur pour modifier la classe instancié, sans avoir à recompiler...

    Mais rien ne t'oblige à l'utiliser !


    Citation Envoyé par ®om
    Parce que l'initialisation (ici pas l'instanciation, car on ne fait pas de newInstance) de la classe charge tout ce qui est static... Ce qui concerne le chargement du driver...
    +1

    Généralement les drivers JDBC utilise un bloc static pour s'enregistrer après du DriverManager. Il contiennent donc un code du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    static {
        DriverManager.registerDriver( new LeDriverJDBC() );
    }
    Ce bloc est exécuté à l'initialisation de la classe... donc via Class.forName() cela permet d'éviter de créer soi-même une instance qui serait inutile...

    Citation Envoyé par ®om
    Mais je crois que maintenant ça n'est plus nécessaire le Class.forName(). Je ne saurais te dire ce qu'il faut utiliser à la place par contre (ou si on peut simplement le supprimer?).
    [mode=un peu HS]
    En fait cela dépend du driver JDBC...
    Java 6 a introduit la notion de service via la classe ServiceLoader (en réalité cette notion existait déjà mais il n'existait pas de classe standard pour cela).

    Cette classe permet de retrouver toutes les classes qui implémentent un interface donné (ou qui hérite d'une certaine classe). Pour cela le nom des classes doivent être renseigné dans un fichier nommé META-INF/services/<nom_de_l'interface> dans le jar. La classe ServiceLoader permettant simplement de charger toutes ces classes...

    Donc pour que cela fonctionne le driver JDBC doit contenir ce fichier...
    [/mode]

    a++

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

Discussions similaires

  1. Class.forName et Class.newInstance
    Par mafanta dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 25/02/2012, 16h41
  2. Quand est-ce qu'on utilise Class.forName ?
    Par andrianiaina dans le forum Langage
    Réponses: 1
    Dernier message: 21/09/2011, 14h06
  3. Réponses: 3
    Dernier message: 19/04/2009, 00h55
  4. [C#]Pourquoi utiliser une structure plutôt qu'une classe?
    Par egoom dans le forum Windows Forms
    Réponses: 2
    Dernier message: 30/10/2006, 10h49
  5. [POO] Pourquoi utiliser les classes ?
    Par GregPeck dans le forum Langage
    Réponses: 7
    Dernier message: 16/12/2005, 16h18

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