$0 (Nombre del programa) en Java? Descubrir clase principal?


¿Hay alguna forma de encontrar el nombre del programa que se está ejecutando en Java? La clase del método principal sería suficiente.

 52
Author: jodonnell, 2008-09-03

8 answers

Prueba esto:

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

Por supuesto, esto solo funciona si se está ejecutando desde el hilo principal. Desafortunadamente, no creo que haya una propiedad del sistema que pueda consultar para averiguar esto.

Edit: Tirando del comentario de @John Meagher, que es una gran idea:

Para ampliar @jodonnell también puede obtener todos los rastros de pila en el sistema usando Hilo.getAllStackTraces(). De esto se puede buscar en toda la pila trazas para el hilo "principal" a determinar qué la clase principal es. Este funcionará incluso si su clase no es corriendo en el hilo principal.

 45
Author: jodonnell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-04 12:37:05
System.getProperty("sun.java.command")
 17
Author: Nadav Brandes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-20 14:14:31

Para ampliar @jodonnell también puede obtener todas las trazas de pila en el sistema usando Thread.getAllStackTraces () . A partir de esto, puede buscar todas las trazas de la pila para el subproceso main para determinar cuál es la clase principal. Esto funcionará incluso si tu clase no se está ejecutando en el hilo principal.

 15
Author: John Meagher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-14 08:30:22

Este es el código que se me ocurrió al usar las respuestas combinadas de jodonnell y John Meagher. Almacena la clase principal en una variable estática para reducir la sobrecarga de llamadas repetidas:

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;
}
 8
Author: Andrew Taylor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-20 02:41:56

También desde la línea de comandos se puede ejecutar la herramienta jps. Suena como un

jps -l 

Te dará lo que quieres.

 3
Author: polarbear,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-03 16:36:55

Para acceder a los objetos de clase cuando se encuentra en un contexto estático

public final class ClassUtils {
    public static final Class[] getClassContext() {
        return new SecurityManager() { 
            protected Class[] getClassContext(){return super.getClassContext();}
        }.getClassContext(); 
    };
    private ClassUtils() {};
    public static final Class getMyClass() { return getClassContext()[2];}
    public static final Class getCallingClass() { return getClassContext()[3];}
    public static final Class getMainClass() { 
        Class[] c = getClassContext();
        return c[c.length-1];
    }
    public static final void main(final String[] arg) {
        System.out.println(getMyClass());
        System.out.println(getCallingClass());
        System.out.println(getMainClass());
    }
}

Obviamente aquí todas las 3 llamadas volverán

class ClassUtils

Pero se obtiene la imagen;

classcontext[0] is the securitymanager
classcontext[1] is the anonymous securitymanager
classcontext[2] is the class with this funky getclasscontext method
classcontext[3] is the calling class
classcontext[last entry] is the root class of this thread.
 2
Author: tschodt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-16 16:44:50

Prueba esto:

Las clases Java tienen instancia estática de su propia clase (java.lang.Tipo de clase).

Eso significa si tenemos una clase llamada Main. Entonces podemos obtener su instancia de clase por Principal.clase

Si solo te interesa el nombre,

String className = Main.clase.getName ();

 -3
Author: color,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-26 08:23:56

O simplemente puedes usar getClass (). Puedes hacer algo como:

public class Foo
{
    public static final String PROGNAME = new Foo().getClass().getName();
}

Y luego PROGNAME estará disponible en cualquier lugar dentro de Foo. Si no estás en un contexto estático, se vuelve más fácil ya que podrías usar esto:

String myProgramName = this.getClass().getName();
 -5
Author: Adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-10 22:31:12