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()之前加载类时,首先执行静态块方法,因此在调用
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@Roflcoptr
java-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是另一个这样的关键字。我最近在文件夹中存储股票数据时遇到问题,因为我使用股票名称作为文件夹名称