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

Nan*_*ale 45 java

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

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

Bal*_*a R 63

public class Foo {
    static {
         System.out.println("Message");
         System.exit(0);
    } 
}
Run Code Online (Sandbox Code Playgroud)

System.exit(0)JVM中之前退出程序开始寻找main()

(注意:这仅适用于java 6.即使它使用JDK 7进行编译,javac也无法使用它运行java,因为它需要一个main(String[])方法.)

  • @BalaR好的.我终于明白了.使用JDK 6的`javac`编译它我可以用JRE/JDK 6的`java`运行它,但是JRE/JDK 7的`java`不会运行它.使用JDK 7的`javac`进行编译,你无法运行它.请更新你的答案.我之前的评论太过于鲁莽,但我知道_something_已经关闭了. (4认同)

Lio*_*ion 12

public final class Main {
    static {
        System.out.println("Hello World");
        System.exit(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

System.exit方法停止执行当前线程,所有其他线程都在其轨道中死亡.System.exit被调用时,虚拟机执行关闭前两个清理任务.

首先,它执行已注册的所有关闭挂钩Runtime.addShutdownHook.这对于释放VM外部的资源很有用.使用shutdown hooks可以在VM退出之前执行必须执行的操作.

VM System.exit调用时执行的第二个清理任务涉及终结器.如果已经调用了其中一个System.runFinalizersOnExit或它的邪恶双胞胎 Runtime.runFinalizersOnExit,则VM会在尚未最终确定的所有对象上运行终结器.这些方法很久以前就被弃用了,并且有充分的理由.永远不要打电话System.runFinalizersOnExitRuntime.runFinalizersOnExit出于任何原因:它们是Java库中最危险的方法之一.调用这些方法可能导致终结器在活动对象上运行,而其他线程同时操作它们,从而导致不稳定的行为或死锁.

总之,System.exit立即停止所有程序线程; 它不会导致finally块执行,但它会在暂停VM之前运行shutdown hooks.当VM关闭时,使用shutdown hooks终止外部资源.可以在不通过调用执行关闭挂钩的情况下暂停VM System.halt,但很少使用此方法.


Pet*_*rey 11

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

class Con {
    String hi = "\n\nHello World\n\n";
}
Run Code Online (Sandbox Code Playgroud)

您只需在Windows上编译该程序即可.不运行它.:-P

  • @ErickRobertson鉴于问题的性质,我不认为他们正在寻找最佳实践解决方案. (14认同)
  • -1在与平台无关的语言中为问题提供特定于平台的解决方案是不正确的. (10认同)
  • @gurung CON是DOS中使用的旧关键字,并作为CONsole的快捷方式转发到Windows.您可以将文件名复制到CON,它将在屏幕上打印.PRN是另一个像这样的关键字.我最近在库存数据存储时遇到了问题,因为我使用了库存名称作为文件夹名称,并且有一个名为"CON"的库存.Windows仍然不允许您使用此名称创建文件夹.它说"指定的设备名称无效." (7认同)
  • 这也打印了很多其他的东西.什么是"骗子"顺便说一下?它不会将文件命名为"Con.java".+1. (3认同)
  • 这是因为`CON`在Windows上有特殊含义,对吗? (2认同)
  • 询问"如何在不使用main()方法的情况下在控制台上打印消息?" 在采访中,他们不是在寻找最佳实践解决方案?它没有说他们是问题中的微软商店,还是我错过了什么? (2认同)

Arn*_*aud 7

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

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

然后运行java命令:

java -Djava.system.class.loader=MyClassLoader

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


Mas*_*uso 6

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

    }
}
Run Code Online (Sandbox Code Playgroud)

因为静态初始化程序块是在首次加载类时执行的,所以我们可以打印出"Hello World"而无需编写main方法.使用"System.exit()"命令停止执行.因此,我们防止"找不到主要方法"错误.这是一个非常棘手的问题