Imprimir mensaje en la consola sin usar el método main ()

Me hicieron esta pregunta en una entrevista.

¿Cómo imprimir mensajes en la consola sin usar el método main() ?

 public class Foo { static { System.out.println("Message"); System.exit(0); } } 

System.exit(0) sale del progtwig antes de que jvm comience a buscar main()

(Nota: Esto solo funciona con java 6. Incluso si se comstack con javac del JDK 7, no se puede ejecutar con su java , porque espera un método main(String[]) .)

 public final class Main { static { System.out.println("Hello World"); System.exit(0); } } 

El bloque estático se ejecuta primero tan pronto como la clase se carga antes de main(); El método se invoca y, por lo tanto, antes de llamar a main() , System.exit(0) inicia el cierre de VM.

El método System.exit detiene la ejecución del hilo actual y todos los demás muertos en sus pistas. Cuando se llama a System.exit , la máquina virtual realiza dos tareas de limpieza antes de apagarse.

Primero, ejecuta todos los enganches de apagado que se han registrado con Runtime.addShutdownHook . Esto es útil para liberar recursos externos a la VM. Use los ganchos de apagado para conocer el comportamiento que debe ocurrir antes de que la máquina virtual salga.

La segunda tarea de limpieza realizada por la VM cuando se llama System.exit se refiere a finalizadores. Si se ha llamado a System.runFinalizersOnExit o a su gemela malvada Runtime.runFinalizersOnExit , la VM ejecuta los finalizadores en todos los objetos que aún no se han finalizado. Estos métodos fueron desaprobados hace mucho tiempo y con buenas razones. Nunca llame a System.runFinalizersOnExit o Runtime.runFinalizersOnExit por ningún motivo: se encuentran entre los métodos más peligrosos en las bibliotecas de Java. Llamar a estos métodos puede hacer que los finalizadores se ejecuten en objetos en vivo mientras que otros hilos los manipulan simultáneamente, lo que da como resultado un comportamiento errático o un interlocking.

En resumen, System.exit detiene todos los hilos del progtwig inmediatamente; no hace que finalmente se ejecuten los bloques, pero ejecuta los ganchos de cierre antes de detener la máquina virtual. Use los ganchos de cierre para finalizar los recursos externos cuando la VM se apaga. Es posible detener la máquina virtual sin ejecutar los ganchos de cierre llamando a System.halt , pero este método rara vez se utiliza.

En un archivo llamado A.java

 class Con { String hi = "\n\nHello World\n\n"; } 

Solo tienes que comstackr el progtwig en Windows. No ejecutarlo. :-PAG

 class MainMethodNot { static { System.out.println("Hello World"); System.exit(0); } } 

Debido a que el bloque de inicializador estático se ejecuta cuando la clase se carga por primera vez, podemos imprimir “Hola mundo” sin escribir un método principal. La ejecución se detiene con el comando “System.exit ()”. Por lo tanto, evitamos el error “método principal no encontrado”. Es una pregunta bastante difícil

Puede definir un cargador de clases personalizado que imprima su mensaje:

 public class MyClassLoader extends ClassLoader { public MyClassLoader(ClassLoader other) { super(other); System.out.println("Hi there"); System.exit(0); } } 

Luego ejecuta el comando java:

java -Djava.system.class.loader=MyClassLoader

(no es necesario agregar una clase como parámetro)

Hasta java 6 fue posible usar System.out.println (); sin main (). Desde java 7 en adelante, no es posible hacerlo con bloque estático. Todavía pedirá el método principal en la clase principal.

Si no quieres usar un bloque estático también, se puede hacer de la siguiente manera

 public class NoMain { private static final int STATUS = getStatus(); private static int getStatus() { System.out.println("Hello World!!"); System.exit(0); return 0; } } 

Sin embargo, tenga en cuenta que esto es para la versión de Java 6. No funciona en Java 7, que se dice que es compatible con Java 8. Intenté con JDK 1.8.0_77-b03, que todavía no funciona

Sí, una de las formas es estática, pero en la versión anterior de JDK no está en JDK 1.7.

 class Withoutmain{ static{ System.out.println("Message: Your message can be print on console without main() method"); System.exit(0); } } 

Salida: Mensaje: su mensaje puede imprimirse en la consola sin el método main () (si no es JDK7)

Salida: Error: Método principal no encontrado en la clase A3, defina el método principal como: public static void main (String [] args)

Referencia

Sí, puede imprimir un mensaje en la consola sin usar main ().

Crea una prueba con JUnit y ejecútala:

 @Test public printTest() { System.out.println("myprint"); } 

En realidad, no funciona en la última actualización de java 8. Puede llamarlo una corrección de errores según ellos, pero por lo que yo creo en mi conocimiento actual esto no se puede llamar como una corrección de errores porque también conduce a algunos cambios conceptuales también en la progtwigción java.