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.
Réponses
Trop de publicités?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.
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.
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;
}