public class CorrectMain {
public static void main(String[] args) {
System.out.println("Valid main method");
}
}
场景3:继承关系中的main方法
子类不会自动继承父类的main方法作为入口点。例如:
// Parent.java
public class Parent {
public static void main(String[] args) {
System.out.println("Parent main");
}
}
// Child.java
public class Child extends Parent {}
执行java Child仍会报错,必须显式在子类中定义main方法。
场景4:特殊运行环境
在以下场景中,main方法不是必需的:
Servlet容器:由容器管理生命周期
// web.xml配置
MyServletcom.example.MyServlet
JavaFX应用:使用Application.launch()
public class FXApp extends Application {
@Override
public void start(Stage stage) {
// GUI初始化
}
public static void main(String[] args) {
launch(args); // 可选
}
}
单元测试:JUnit框架管理测试执行
import org.junit.Test;
public class TestExample {
@Test
public void testMethod() {
// 测试逻辑
}
}
三、高级解决方案
方案1:自定义类加载器
通过实现ClassLoader可以动态加载类并执行方法:
public class DynamicLoader extends ClassLoader {
public void executeMethod(String className, String methodName)
throws Exception {
Class> clazz = loadClass(className);
Method method = clazz.getMethod(methodName);
method.invoke(null); // 静态方法
}
}
方案2:反射机制调用
使用反射API可以绕过main方法直接执行程序逻辑:
public class ReflectionRunner {
public static void run(String className) throws Exception {
Class> clazz = Class.forName(className);
Method main = clazz.getMethod("main", String[].class);
main.invoke(null, (Object) new String[0]);
}
}
方案3:Java Agent机制
通过Java Agent可以在JVM启动前修改字节码:
public class MyAgent {
public static void premain(String args, Instrumentation inst) {
// 预加载逻辑
}
}