📌  相关文章
📜  我们可以在没有 main() 方法的情况下执行程序吗?无论(1)

📅  最后修改于: 2023-12-03 15:09:57.029000             🧑  作者: Mango

可以在没有 main() 方法的情况下执行程序吗?

Java 程序在执行时首先寻找的是 main() 方法。也就是说,如果没有 main() 方法,程序是无法执行的。但是,我们可以通过其他方式在没有 main() 方法的情况下执行程序。下面介绍两种方法:

1. 使用 static 代码块

Java 程序在加载类时会执行 static 代码块。因此,我们可以通过在类中加入 static 代码块,来执行我们想要执行的程序。

代码片段如下:

public class NoMainMethod {
    static {
        System.out.println("Hello, world!");
    }
}

以上代码中,我们在 NoMainMethod 类中添加了一个 static 代码块,在其中打印了一句 "Hello, world!"。当我们执行该类时,就会输出 "Hello, world!"。

2. 使用 JDK 工具类

JDK 中提供了一个名为 java.util.ServiceLoader 的工具类。它会在运行时自动搜索并加载我们的服务(Service)。我们可以通过创建一个符合 Service 规范的接口,并在 META-INF/services 目录下创建一个以接口全限定名为名的文件,来让 ServiceLoader 加载我们的服务。当然,在这个过程中我们可以编写任何我们想要执行的程序。

代码片段如下:

  1. 创建接口文件,文件名为 com.example.MyService;

  2. 在接口文件中添加我们想要执行的程序,代码片段如下:

package com.example;

public interface MyService {
    void run();
}
  1. 在 META-INF/services 目录下创建文件 com.example.MyService,将实现该接口的类的全限定名写入文件中。代码片段如下:
com.example.MyServiceImpl
  1. 实现接口 MyService 的类代码片段如下:
package com.example;

public class MyServiceImpl implements MyService {
    @Override
    public void run() {
        System.out.println("Hello, world!");
    }
}
  1. 调用 ServiceLoader,代码片段如下:
ServiceLoader<MyService> loader = ServiceLoader.load(MyService.class);
for (MyService myService : loader) {
    myService.run();
}

以上代码通过 ServiceLoader 加载实现 MyService 接口的类,并执行对应的 run() 方法。当我们执行该代码时,就会输出 "Hello, world!"。

结论

Java 程序在默认情况下是需要 main() 方法的,但是我们可以通过其他方式,在没有 main() 方法的情况下执行程序。其中,使用 static 代码块可以让我们在类被加载时执行一些程序;使用 JDK 工具类则可以在运行时自动搜索并加载我们想要执行的服务。