19

据我所知,我们无法在没有 main 方法的情况下执行,因为当您运行 java 程序时。java虚拟机查找main方法。如果JVM找不到main方法,它将显示运行时错误线程main中的异常找不到主类。

但是我搜索了很多博客,其中一些人说,是的,如果java程序中有一个静态块,可以通过静态博客来完成,类加载器在java调用main()方法之前加载所有静态块!

真的有可能吗?这些的可用性是什么。

4

4 回答 4

34

现在不


在 Java 7 之前:

是的,顺序如下:

  • jvm 加载类
  • 执行静态块
  • 查找 main 方法并调用它

因此,如果静态块中有代码,它将被执行。但这样做没有任何意义。

如何测试:

public final class Test {
    static {
        System.out.println("FOO");
    }
}

然后,如果您尝试运行该类(使用java TestIDE 或使用 IDE 的形式命令行),结果是:

FOO
java.lang.NoSuchMethodError:主要

于 2013-03-02T10:39:45.747 回答
5

是的,您可以在没有 main 方法的情况下编译和执行使用静态块。但是在执行(打印)静态块之后,您将收到一条错误消息,指出找不到主要方法。

最新信息 --> 你不能用 JAVA 7 版本做到这一点。IT 不会执行。

{
    static
    {
        System.out.println("Hello World!");
        System.exit(0); // prevents “main method not found” error
    }
}

但这不会在 JAVA 7 版本中执行。

于 2013-03-02T11:17:30.173 回答
3

由于您也标记了 Java-ee - 那么的,这是可能的。

在核心java中也可以使用静态块

并检查这个如何在没有 main 方法的情况下运行 Java 程序?

编辑:
正如在其他答案中已经指出的那样 - 它不支持 Java 7

于 2013-03-02T10:38:59.470 回答
2

您还应该能够使用Java 代理的 premain 方法完成类似的事情。

代理 JAR 文件的清单必须包含属性 Premain-Class。该属性的值是代理类的名称。代理类必须实现一个原则上类似于主应用程序入口点的公共静态 premain 方法。在 Java 虚拟机 (JVM) 初始化之后,每个 premain 方法将按照代理指定的顺序被调用,然后真正的应用程序 main 方法将被调用。每个 premain 方法必须返回才能继续启动序列。

于 2013-03-02T10:55:37.340 回答