在控制台上打印消息,而不使用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.runFinalizersOnExit
或Runtime.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"); }