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 :

Trouver le constructeur de la classe dans le main


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 29
    Par défaut Trouver le constructeur de la classe dans le main
    Bonjour.

    Voila mon problème du jour.
    J'ai un ensemble de batchs à lancer sur une machine.
    Ces batchs ont un ensemble de fonctionnalités communes et se déroulent plus ou moins de la même façon. Pour éviter la redite de code, j'ai codé une classe abstraite qui contient les éléments communs.

    Les batchs sont lancés par la méthode main, et c'est là que se situe mon problème. J'avais prévu d'avoir la méthode main dans la classe abstraite puisque le fonctionnement est assez standard : Récupération des paramètres, vérification, et lancement des méthodes du batch.
    Sauf que je n'ai pas trouvé de moyen depuis le main de lancer le constructeur de la classe sans en connaitre le nom. De plus, vu que la méthode main est statique, elle est partagée par toutes les classes filles, et je me demande comment je vais pouvoir m'en sortir pour lancer les instances des bonnes classes.

    Pour schématiser, on va dire que j'ai une classe monappli.AbstractBatch qui a deux classes filles monappli.Batch1 et monappli.Batch2.
    Quand je lance java monappli.Batch1, j'aimerais qu'il instancie la classe Batch1 et qu'il exécute ses méthodes, et pas celles de Batch2 ou AbstractBatch


    Voila.

    Si quelqu'un a une idée, je suis preneur.

  2. #2
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Bonjour,
    ce qui te gêne c'est d'avoir autant de méthodes main que de classes Batch ?
    Tu pourrais isoler le code de lancement d'un batch dans une classe dédiée à ça, Launcher, dont la méthode main prendrait en entrée le nom du batch à lancer, suivi des arguments :
    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
    public class Launcher {
    	public static void main(String[] args) {
    		String className = args[0];
    		String param1 = args[1];
     
    		try {
    			AbstractBatch batch = (AbstractBatch) Class.forName(className).newInstance();
    			batch.setParam1(param1);
    			batch.run();
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		} catch (InstantiationException e) {
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			e.printStackTrace();
    		}
    	}
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 29
    Par défaut
    Citation Envoyé par herve91 Voir le message
    Bonjour,
    ce qui te gêne c'est d'avoir autant de méthodes main que de classes Batch ?
    C'est à peu près ça, oui. Avoir un code main identique (ou presque) dans toutes mes classes Batch ne me convient pas particulièrement.

    Citation Envoyé par herve91 Voir le message
    Tu pourrais isoler le code de lancement d'un batch dans une classe dédiée à ça, Launcher, dont la méthode main prendrait en entrée le nom du batch à lancer, suivi des arguments
    J'y ai effectivement pensé, et c'est probablement ce que je ferais si je ne trouve pas d'autre solution. Néanmoins, je me dis qu'il doit y avoir un moyen.

    Si on regarde le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Test {
    	public static String bonjour() {
    		return "Bonjour !!";
    	}
     
    	public static void main(String[] args) {
    		System.out.println(bonjour());
    	}
    }
    Ca marche parfaitement. Sans préciser le nom de la classe, juste avec le nom de la méthode statique, il parvient à trouver la classe de cette méthode. C'est donc bien qu'il a une connaissance, peut être limitée, mais une connaissance quand même du contexte dans lequel il s'exécute. Donc je me dis qu'il doit être possible de récupérer le contexte.

  4. #4
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Un exemple qui montre que l'accès aux méthodes statiques peut réserver des surprises :
    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
    public class Test {
    	public static String bonjour() {
    		return "Bonjour !!";
    	}
    	public static void main(String[] args) {
    		System.out.println(bonjour());
    	}
    }
     
    public class Test2 extends Test {
    	public static String bonjour() {
    		return "Au revoir !!";
    	}
    	public static void main(String[] args) {
    		System.out.println(bonjour());
    	}
    }
    Le lancement de Test donne : Bonjour !!
    Le lancement de Test2 donne : Au revoir !!

    Maintenant enlève la redéfinition de main() dans Test2 :

    Le lancement de Test donne : Bonjour !!
    Le lancement de Test2 donne : Bonjour !!

  5. #5
    Membre émérite

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Par défaut
    bonjour,

    juste une petite remarque pour appuyer la reponse d'Hervé91 ,

    les méthodes et variable static sont des méthodes/variables de classe et non pas d'instance. Il est donc facile de perdre le controle de ces variables car si l'un d'elle est modifié elle le restera et ne se réinitialisera pas a la fin de l'execution de l'instance.

    la meilleure solution reste le code proposé par hervé et la classe Launcher.

Discussions similaires

  1. Instancier une classe dans son main : pour ou contre ?
    Par sphynxounet dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 17/12/2012, 16h19
  2. Réponses: 6
    Dernier message: 10/06/2007, 13h33
  3. Réponses: 7
    Dernier message: 22/10/2006, 18h51
  4. Réponses: 3
    Dernier message: 06/11/2005, 18h02
  5. [debutant] rappel de la classe dans le constructeur
    Par newtito dans le forum Débuter
    Réponses: 6
    Dernier message: 05/10/2005, 00h15

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