反射扩展
Spring Boot Loader 源码分析中,有这么一行代码,通过反射调用 main 方法。
mainMethod.invoke(null, new Object[] { null });
invoke
invoke 方法一般会接收 2 个参数,第 1 个是被调用方法所在类的对象,第 2 个参数被调用方法所接收的参数。
而 Spring Boot 这里为什么第 1 个参数传递的是 null ?
源码
@SpringBootApplication
public class MicroservicesApplication {
public static void main(String[] args) {
SpringApplication.run(MicroservicesApplication.class, args);
}
}
原因
这里反射调用的是 main 方法,main 方法是静态方法。原则上,静态方法是不归属于它所在的具体类,它只是把静态方法寄存在它所在的具体类。java 中所有的方法,都需要依托一个具体的类才能存在。寄存在这个类,其实也就相当于依托这个类。
静态方法不归属于它所在的类,而是归属于当前所在类对应的 class 对象。
所以这里是可以传 null,也可以传递具体的对象。
实践
先定义 Dog。
public class Dog {
public static void main(String[] args) {
System.out.println("wang wang wang...");
}
}
再定义 DogReflect,通过反射调用 Dog 的 main 方法。
public class DogReflect {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<?> mainClass = Dog.class;
Method mainMethod = mainClass.getDeclaredMethod("main", String[].class);
mainMethod.invoke(null, new Object[] { null });
}
}
正常执行,说明调用是没问题的。

通过一个实例来调用,而不用null,结果也是正确的。
mainMethod.invoke(new Dog(), new Object[] { null });
Last updated
Was this helpful?