tipos - registro de alumnos en java netbeans
$ 0(nombre del programa) en Java? Descubre la clase principal? (8)
Para ampliar en @jodonnell, también puedes obtener todos los rastros de pila en el sistema usando Thread.getAllStackTraces () . A partir de esto, puede buscar todos los rastros de pila para el hilo main
para determinar cuál es la clase principal. Esto funcionará incluso si su clase no se ejecuta en el hilo principal.
¿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.
También desde la línea de comando puede ejecutar la herramienta jps . Suena como un
jps -l
te conseguirá lo que quieras
Prueba esto:
StackTraceElement[] stack = Thread.currentThread ().getStackTrace ();
StackTraceElement main = stack[stack.length - 1];
String mainClass = main.getClassName ();
Por supuesto, esto solo funciona si estás ejecutando desde el hilo principal. Lamentablemente, no creo que haya una propiedad del sistema que pueda consultar para descubrirlo.
Editar: Extrayendo el comentario de John Meagher, que es una gran idea:
Para ampliar en @jodonnell, también puedes obtener todos los rastros de pila en el sistema usando Thread.getAllStackTraces (). A partir de esto, puede buscar todos los rastros de pila para el subproceso "principal" para determinar cuál es la clase principal. Esto funcionará incluso si su clase no se ejecuta en el hilo principal.
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, es más fácil ya que puedes usar esto:
String myProgramName = this.getClass().getName();
Prueba esto :
Las clases de Java tienen una instancia estática de su propia clase (tipo java.lang.Class).
Eso significa que tenemos una clase llamada Main. Entonces podemos obtener su instancia de clase por Main.class
Si estás interesado en el nombre solo entonces,
String className = Main.class.getName ();
Para acceder a los objetos de clase cuando estás 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í regresarán las 3 llamadas
class ClassUtils
pero entiendes 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")