在控制台上打印消息,而不使用main()方法

我在接受采访时被问到了这个问题。

如何在不使用main()方法的情况下在控制台上打印消息?

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

在jvm开始查找main()之前, System.exit(0)退出程序。

Ideone链接

(注意:即使它用JDK 7的javac ,也不能用它的java运行,因为它需要一个main(String[])方法。)

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

一旦在main();之前加载类,静态块将首先执行main(); 方法被调用,因此在调用main()之前, System.exit(0)启动VMclosures。

System.exit方法暂停执行当前线程和所有其他线程死亡。 当调用System.exit ,虚拟机在closures之前执行两个清理任务。

首先,它执行已经用Runtime.addShutdownHook注册的所有closures钩子。 这对释放VM外部的资源很有用。 在虚拟机退出之前,使用closures挂钩来实现必须发生的行为。

调用System.exit时由VM执行的第二个清理任务涉及到终结器。 如果System.runFinalizersOnExit或者其恶意的双胞胎Runtime.runFinalizersOnExit被调用,虚拟机将运行尚未完成的所有对象的终结器。 这些方法很久以前就被弃用了,理由很充分。 不要因为任何原因调用System.runFinalizersOnExitRuntime.runFinalizersOnExit :它们是Java库中最危险的方法之一。 调用这些方法可能会导致终结器在活动对象上运行,而其他线程正在同时操作它们,导致不稳定的行为或死锁。

总之, System.exit立即停止所有程序线程; 它不会导致finally块被执行,但是在停止虚拟机之前它会运行closures钩子。 当VMclosures时,使用closures挂钩来终止外部资源。 通过调用System.halt可以暂停虚拟机而不执行关机挂钩,但是这种方法很less使用。

在一个名为A.java的文件中

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

你只需要在Windows上编译程序。 不运行它。 😛

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

因为静态初始化块是在第一次加载的时候执行的,所以我们可以在不写主要方法的情况下打印出“Hello World”。 使用“System.exit()”命令停止执行。 所以,我们防止“主要方法未find”的错误。 这是一个相当棘手的问题

你可以定义一个打印你的消息的自定义类加载器:

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

然后运行java命令:

java -Djava.system.class.loader=MyClassLoader

(不需要添加一个类作为参数)

直到java 6才能使用System.out.println(); 没有main()。 从Java 7开始,使用静态块是不可能的。 它仍然会要求在主要类的主要方法。

如果您不想使用静态块,则可以按照以下方法完成

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

但请注意,这是Java 6版本。 它在Java 7中不工作,据说在Java 8中被支持。我尝试使用JDK 1.8.0_77-b03,它仍然不工作

是的,其中一种方式是静态模块,但在JDK 1.7以前版本中不是JDK。

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

输出:消息:您的消息可以在没有main()方法的情况下在控制台上打印(如果不是JDK7)

输出:错误:在A3类中找不到main方法,请定义main方法为:public static void main(String [] args)

参考

实际上它不能在java 8的最新更新中运行。根据他们的说法,可以称之为错误修复,但据我所知,这不能称为错误修复,因为它也会导致java编程中也没有什么概念上的改变。

是的,你可以在不使用main()的情况下将消息打印到控制台。

用JUnit创build一个testing并执行它:

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