Java 不使用main()方法在控制台上打印消息
我在一次采访中被问到这个问题 如何在不使用Java 不使用main()方法在控制台上打印消息,java,Java,我在一次采访中被问到这个问题 如何在不使用main()方法的情况下在控制台上打印消息 public class Foo { static { System.out.println("Message"); System.exit(0); } } System.exit(0)在jvm开始查找main() (注意:这只适用于java 6。即使它使用JDK 7的javac编译,也不能使用它的java运行,因为它需要一个main(String[])方
main()
方法的情况下在控制台上打印消息
public class Foo {
static {
System.out.println("Message");
System.exit(0);
}
}
System.exit(0)
在jvm开始查找main()
(注意:这只适用于java 6。即使它使用JDK 7的
javac
编译,也不能使用它的java
运行,因为它需要一个main(String[])
方法。)在一个名为a.java
的文件中
class Con {
String hi = "\n\nHello World\n\n";
}
你只需要在Windows上编译程序。不要运行它-P
class MainMethodNot
{
static
{
System.out.println("Hello World");
System.exit(0);
}
}
因为静态初始值设定项块是在类首次加载时执行的,所以我们可以打印出“helloworld”,而无需编写main方法。使用“System.exit()”命令停止执行。因此,我们防止了“未找到主方法”错误。
这是一个相当棘手的问题
public final class Main {
static {
System.out.println("Hello World");
System.exit(0);
}
}
在main()之前加载类时,首先执行静态块调用code>方法,因此在调用main()
之前,System.exit(0)
启动VM关闭
System.exit
方法停止当前线程的执行,并停止所有其他线程的运行。调用System.exit
时,虚拟机在关闭前执行两个清理任务
首先,它执行已在Runtime.addShutdownHook
中注册的所有关机挂钩。这对于在VM外部释放资源非常有用。对必须在VM退出之前发生的行为使用关闭挂钩
调用System.exit
时VM执行的第二个清理任务
关注终结器。如果System.runFinalizersOnExit
或其邪恶孪生兄弟
Runtime.runFinalizersOnExit
已被调用,VM将在上运行终结器
所有尚未最终确定的对象。长期以来,这些方法都被弃用
很久以前,有充分的理由。切勿调用System.runFinalizersOnExit
或
Runtime.runFinalizersOnExit
出于任何原因:它们是
Java库中的危险方法。调用这些方法可能导致终结器在活动对象上运行,而其他线程正在并发操作
它们会导致不稳定的行为或死锁
总之,System.exit
立即停止所有程序线程;事实并非如此
导致最后执行块,但它在停止之前确实运行关闭挂钩
虚拟机。当VM关闭时,使用关闭挂钩终止外部资源
放下。通过调用
System.halt
,但此方法很少使用。您可以定义一个自定义类加载器来打印消息:
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
(不需要添加类作为参数)是的,其中一种方法是静态块,但在以前版本的JDK中,JDK1.7中没有
class Withoutmain{
static{
System.out.println("Message: Your message can be print on console without main() method");
System.exit(0);
}
}
输出:消息:您的消息可以在控制台上打印,而无需main()方法(如果不是JDK7)
输出:错误:在A3类中找不到主方法,请将主方法定义为:
公共静态void main(字符串[]args)
直到Java6才有可能使用System.out.println();没有main()。
从Java7开始,使用静态块是不可能的。它仍然会在main类中请求main方法。如果您不想使用静态块,可以按照下面的方法来完成
public class NoMain {
private static final int STATUS = getStatus();
private static int getStatus() {
System.out.println("Hello World!!");
System.exit(0);
return 0;
}
}
但是,请注意,这是针对Java6版本的。据说Java8支持它。我试过使用JDK1.8.0_77-b03,它仍然不起作用实际上它在最新的Java8更新中不起作用。根据他们的说法,您可以称之为bug修复,但据我目前所知,这不能称为bug修复,因为它也会导致java编程中的一些概念性变化。是的,您可以在不使用main()的情况下将消息打印到控制台 使用JUnit创建并执行测试:
@Test
public printTest() {
System.out.println("myprint");
}
如果没有一个主要的方法,你将如何开始你的申请?我不认为这是一个好的面试问题。你肯定想测试应聘者的问题解决能力,而不是Java很少使用的方面的知识吗?@CallumRogers+1琐事是最糟糕的问题,任何提出这些问题的人都不配当我的老板。在Bash中,只需键入“echo”。做最简单的事情也应该得到额外的分数。在Java7中/之后不可能,因为在加载类之前会查找main()方法。@Roflcoptr
$java Foo
,就像任何other@Roflcoptrjava-cp。Foo
像一个带有main的程序。;)@Roflcoptr只需编译类并运行javafoo
即可加载类,打印消息;我们在它开始找到执行的入口点之前退出。@KohányiRóbert您做错了什么-可能您在文件中错误地大写了类名?它适用于我的Java1.6.023。@BalaR OK。我终于明白了。用jdk6的javac
编译它,我可以用JRE/jdk6的java
运行它,但是JRE/jdk7的java
不会运行它。用JDK 7的javac
编译它,你不能什么都不做就运行它。请更新您的答案。我以前的评论太草率了,但我知道有些东西坏了。这是因为CON
在Windows上有特殊的意义,对吧?这也会打印很多其他的东西。顺便问一下,“骗局”是什么?它不允许将文件命名为“Con.java”+1.-1用独立于平台的语言提供特定于平台的问题解决方案是不正确的。@gurung-CON是DOS中使用的旧关键字,作为控制台的快捷方式转入Windows。您可以将文件名复制到CON,并在屏幕上打印。PRN是另一个这样的关键字。我最近在文件夹中存储股票数据时遇到问题,因为我使用股票名称作为文件夹名称