¿Hay alguna forma de encontrar el nombre del programa que se ejecuta en Java? La clase del método principal sería lo suficientemente buena.
Respuesta
Prueba esto:
StackTraceElement[] stack = Thread.currentThread().getStackTrace();
StackTraceElement main = stack[stack.length - 1];
String mainClass = main.getClassName();
Por supuesto, esto sólo funciona si se está ejecutando desde el hilo principal. Lamentablemente, no creo que haya una propiedad del sistema que pueda consultar para descubrirlo.
Editar: Tirando en el comentario de @ John Meagher, que es una gran idea:
Para ampliar @jodonnell también puede obtener todos los seguimientos de pila en el sistema usando Thread.getAllStackTraces() . Desde esto puede buscar todas las trazas de la pila para el subproceso "principal" al determinar cuál es la clase principal. Este funcionará incluso si su clase no está ejecutándose en el hilo principal.
También desde la línea de comandos puede ejecutar la herramienta jps. Suena como un
jps -l
le conseguirá lo que quiere.
Para ampliar en @jodonnell también puede obtener todos los rastros de pila en el sistema usando Thread.getAllStackTraces(). A partir de esto, puede buscar todas las trazas de pila para el subproceso main
para determinar cuál es la clase principal. Esto funcionará incluso si su clase no se ejecuta en el hilo principal.
Es posible que el hilo principal deje de ejecutarse pero la aplicación continúa (otros hilos que no son daemon). Esto probablemente ocurra en muchas aplicaciones GUI/Swing ya que la expresión común es para que el hilo principal invoque en EDT para crear el primer cuadro y luego terminar. –
O simplemente podría usar getClass(). Puede 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 hace más fácil que usted podría utilizar esto:
String myProgramName = this.getClass().getName();
No creo que esto resuelva el problema. El póster no sabe qué clase contiene el método 'main' que se invocó cuando se inició Java (quizás es parte de una biblioteca de terceros). –
Esto no tiene ningún sentido. Solo funciona si sabía que 'Foo' era la clase principal. Pero entonces no necesitaría hacer esto. – maaartinus
Prueba esto:
clasesJava tienen instancia estática de su propia clase (tipo java.lang.Class) .
Eso significa que si tenemos una clase llamada Principal. entonces podemos obtener su instancia de clase por Main.class
Si usted está interesado en el nombre sólo entonces,
cadena className = Main.class.getName();
Pero en este caso no sabes qué clase es la clase "principal". – ryantm
Para el acceso a los objetos de la clase cuando se está 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.
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;
}
System.getProperty("sun.java.command")
verificado en JDK 1.7.0_07 – sourcedelica
Creo que esto solo funciona en la máquina virtual de HotSpot. ver http://java.dzone.com/articles/programmatically-restart-java – ericsoco
- 1. Obtener el nombre del programa Java
- 2. No se pudo encontrar la clase principal, programa saldrá
- 3. Descubre qué clase llamó a un método en otra clase
- 4. UPN - Nombre principal del usuario
- 5. cómo configurar la clase principal predeterminada en java?
- 6. Descubre la clase de una invocación de método en el procesador de anotaciones para java
- 7. compilación del programa java
- 8. Impresión del nombre de clase derivada en la clase base
- 9. ¿Orígenes del nombre 'principal' para el punto de entrada del programa?
- 10. En un idioma OO, ¿cuál es el nombre de su clase que contiene el método principal?
- 11. ¿Es necesario el método Principal en un programa Java?
- 12. System.exit (0) en java
- 13. "No se pudo encontrar la clase principal"
- 14. Descubre las subclases de una clase determinada en Obj-C
- 15. `java (0% 2! = 0) == false`
- 16. Cómo ejecutar el programa Java en el símbolo del sistema
- 17. Sin acceso a argv [0], ¿cómo obtengo el nombre del programa?
- 18. ¿Cómo implementar el detector de eventos en el fondo del programa principal en Java?
- 19. Java: ¿Cómo ejecutar el hilo por separado desde el programa/clase principal?
- 20. Cómo sincronizar la velocidad de ejecución del programa Java
- 21. ¿Por qué Java no pudo encontrar la clase principal?
- 22. Nombre de clase y nombre de archivo
- 23. Error: No se pudo encontrar o cargar la clase principal en Eclipse
- 24. Android - Descubre qué hora del día es
- 25. ventana del navegador abierta del programa Java
- 26. Copie los campos de su clase principal en Java
- 27. Cómo obtener un objeto de clase del nombre de clase en Java
- 28. Accediendo a la clase principal en Backbone
- 29. ¿Cómo obtener la clase de actividad principal o el nombre de clase de mi aplicación?
- 30. Making paquete protegido clase java visible en paquete principal
buen truco. En general, uno llamaría esto desde main(), por lo que solo hay un hilo en este punto, pero en caso de que se llame desde otro lugar, es mejor que tengamos este problema en el hilo ... – PhiLho
No hay ninguna garantía principal para se ejecutará cuando intente encontrar el nombre de la aplicación de otros hilos. El hilo principal podría terminar normalmente y algunos otros hilos de fondo aún no terminados. No creas que es legítimo hacer este truco distinto del hilo principal. –