54 votes

0 (Nom du programme) en Java ? Découvrez la classe principale ?

Existe-t-il un moyen de trouver le nom du programme qui s'exécute en Java ? La classe de la méthode main serait suffisante.

45voto

jodonnell Points 14999

Essayez ça :

    StackTraceElement[] stack = Thread.currentThread ().getStackTrace ();
    StackTraceElement main = stack[stack.length - 1];
    String mainClass = main.getClassName ();

Bien sûr, cela ne fonctionne que si vous vous exécutez à partir du thread principal. Malheureusement, je ne pense pas qu'il y ait une propriété du système que vous pouvez interroger pour le savoir.

Editar: Je m'inspire du commentaire de @John Meagher, qui est une excellente idée :

Pour compléter les propos de @jodonnell, vous pouvez également obtenir toutes les traces de pile dans le système en utilisant Thread.getAllStackTraces(). À partir de vous pouvez rechercher toutes les traces stack traces pour le Thread "main" afin de déterminer quelle est la classe principale. Ce site fonctionnera même si votre classe n'est pas exécutée dans le thread principal.

18voto

Nadav Brandes Points 81
System.getProperty("sun.java.command")

15voto

John Meagher Points 6734

Pour développer @jodonnell, vous pouvez également obtenir toutes les traces de pile dans le système en utilisant Thread.getAllStackTraces() . À partir de là, vous pouvez rechercher toutes les traces de la pile pour l'élément suivant main Thread pour déterminer quelle est la classe principale. Cela fonctionnera même si votre classe n'est pas exécutée dans le thread principal.

8voto

Andrew Taylor Points 323

Voici le code que j'ai trouvé en utilisant les réponses combinées de jodonnell et John Meagher. Il stocke la classe principale dans une variable statique afin de réduire l'impact des appels répétés :

private static Class<?> mainClass;

public static Class<?> getMainClass() {
  if (mainClass != null)
    return mainClass;

  Collection<StackTraceElement[]> stacks = Thread.getAllStackTraces().values();
  for (StackTraceElement[] currStack : stacks) {
    if (currStack.length==0)
      continue;
    StackTraceElement lastElem = currStack[currStack.length - 1];
    if (lastElem.getMethodName().equals("main")) {
      try {
        String mainClassName = lastElem.getClassName();
        mainClass = Class.forName(mainClassName);
        return mainClass;
      } catch (ClassNotFoundException e) {
        // bad class name in line containing main?! 
        // shouldn't happen
        e.printStackTrace();
      }
    }
  }
  return null;
}

3voto

polarbear Points 2662

En outre, à partir de la ligne de commande, vous pouvez exécuter la commande jps outil. On dirait un

jps -l

vous permettra d'obtenir ce que vous voulez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X