Partage
  • Partager sur Facebook
  • Partager sur Twitter

[JEE5-JSE] ClassLoader - Chargement dynamique de class

Charger est creer un objet d'une class a partir de son nom

Sujet résolu
    8 décembre 2009 à 22:18:11

    Bonjour,

    Je fais appel à vous car je me casse le crâne sur un problème pas très compliqué, mais je ne trouve pas la solution sur le web.

    J'ai commencé à me développer un petit framework pour créer des appli web, avec celui-ci, j'ai besoin de charger dynamiquement mes Class Action (inspiré de MVC2 un controleur et que des action) uniquement en connaissant leur nom stocké dans une variable de type String.
    Mon petit framework et en quelque sorte un conteneur d'appli (appli authentification, appli videos, appli users...) ces applications n'ont pas de controleur, uniquement des actions.

    exemple:
    appli : authentification
    actions :
    • connexion
    • deconnexion
    • inscription
    • pass-oublie
    • activer-compte


    chacune de mes actions hérite de la classe ActionParent.
    chacune de mes actions implemente l'interface IAction.

    public interface IAction {
    // init - comme pour les servlet en JEE - constructeur de la classe
    public void init(AppConfig config);
    // doPublic action pour la section public du site
    public ResponseContainer doPublic(CurrentRequest request);
    // doOffice action pour le backOffice
    public ResponseContainer doOffice(CurrentRequest request);
    }
    


    ce qui donne ce genre de requête http : http://monsite.com/?app=authentification&action=connexion

    Bon voila pour les quelques explications de base.


    Mon problème:

    Une fois les paramètres extrait de ma requête http et de l'identification de l'action à exécuter, je me retrouve avec une variable de type String contenant le nom de ma classe à loader et à insctancer.

    String action = "com.jwapp.actions.authentification.ConnexionAction";
    



    J'ai bien fouiller a gauche a droite sur le web, donc je pense que la reponse se tourne autour d'un ClassLoader développé sur mesure et de l'objet "Class". Mais je ne trouve pas d'exemple sur lequel m'appuyer pour développer mon ClassLoader.

    Si vous avez des idées ou même la solution à mon probleme, je prend :D


    ps -> ca fait pas longtemps que j'apprends java, je fais donc appel à votre indulgence.
    • Partager sur Facebook
    • Partager sur Twitter
      10 décembre 2009 à 8:27:46

      Pour créer une instance de ton action :
      String nomAction = "com.jwapp.actions.authentification.ConnexionAction";
      Class cl = Class.forName(nomAction);
      ActionParent comm = (ActionParent)cl.newInstance();
      

      Pourquoi c'est pas ParentAction qui implémente l'interface IAction ?

      Ps: Le tuto java du sdz traite de la réflexivité : http://www.siteduzero.com/tutoriel-3-1 [...] lexivite.html
      • Partager sur Facebook
      • Partager sur Twitter
        10 décembre 2009 à 16:35:15

        Salut !

        en complément à ce qu'a dit helitik, tu peux regarder ce lien, qui parle des applications modulaires. Il y un chapitre sur le ClassLoader.
        • Partager sur Facebook
        • Partager sur Twitter
          11 décembre 2009 à 15:04:38

          Citation : helitik


          Pourquoi c'est pas ParentAction qui implémente l'interface IAction ?


          Oui, en effet, erreur d'édition de ma part ;)

          Très pertinente ta réponse, c'est tout léger (3 lignes). En faite du coup j'ai une instance de mon objet comme si je l'avais créer avec new, donc aucune contrainte ? (classe, c'est le cas de le dire).


          Tarfaa

          A ouais pas mal, je pourrais aussi m'en inspirer de ce système, mais ce serai peut être un peut trop lourd de jouer avec des .jar pour chaque appli web peut être.
          En tout cas, le ClassLoader est un bon exemple, merci.



          Je vais revoir mon code avec ces explications et sources je posterais mon résultats (ou mes question ;) )


          [edit]

          Je pensais, avec mon interface sur ParentAction, je redéfini mes méthodes dans la classe parent, du coup quand je les redéfini dans mes classes Action, c'est de la surcharge ni plus ni moins ? j'hésite, lequel serais le plus adapté, implémenté mon interface sur chaque Action, ou sur la classe mère ?
          • Partager sur Facebook
          • Partager sur Twitter
            11 décembre 2009 à 17:43:01

            Si toute tes actions ont besoin des méthodes de l'interface, c'est ParentAction qui doit l'implémenter.
            • Partager sur Facebook
            • Partager sur Twitter
              11 décembre 2009 à 20:21:23

              Je ne comprend plus bien l'intérêt de l'interface du coup. car étend donné que les méthodes seront définies dans ma classe mère, plus rien ne m'oblige à les redéclarer dans mes classes enfants ? (je me trompe peut être ? )

              Par contre, un avantage est que je peux définir des comportements par défaut dans ma classe mère.
              • Partager sur Facebook
              • Partager sur Twitter
                12 décembre 2009 à 10:58:30

                Si les méthodes de l'interface ont des comportements différents en fonction de tes actions tu auras besoin de les redéfinir dans tes enfants..
                Si l'interface ne sert à rien d'autre tu peux la zapper et déclarer les méthodes de l'interface dans ta classe mére.
                • Partager sur Facebook
                • Partager sur Twitter
                  12 décembre 2009 à 20:23:34


                  Je pense que je vais simplement utilisé la redéfinition des méthodes mère. Cela me permettra de définir un comportement par défaut (ex: log, erreur("action non déclaré") ).

                  Merci pour ces conseils, je cerne mieux mon problème et je vois très clairement comment procéder à présent :)
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [JEE5-JSE] ClassLoader - Chargement dynamique de class

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown