SpringBoot源码之deduceMainApplicationClass方法推断main函数所在类原理

在SpringBoot启动流程中,有一个推断main函数所在类的方法deduceMainApplicationClass方法用于推断出当前启动的main函数所在的类。

private Class<?> deduceMainApplicationClass() {
    try {
        StackTraceElement[] stackTrace = new RuntimeException().getStackTrace();
        for (StackTraceElement stackTraceElement : stackTrace) {
            if ("main".equals(stackTraceElement.getMethodName())) {
                return Class.forName(stackTraceElement.getClassName());
            }
        }
    }
    catch (ClassNotFoundException ex) {
        // Swallow and continue
    }
    return null;
}

deduceMainApplicationClass的实现原理比较巧妙,新建了一个运行时异常对象,通过这个对象获取当前的调用函数堆栈数组StackTrace,之后遍历这个堆栈数组,找到方法名为main的类,返回这个类。

SpringBoot将deduceMainApplicationClass方法推断出来的类赋值给了this.mainApplicationClass。通过idea的Find Usages查看属性的使用情况,发现只是在banner打印或者log上有涉及,好像没发现有很大的重要性。

虽然没有发现this.mainApplicationClass比较重要的使用价值,但是推断这个类的实现方法deduceMainApplicationClass的实现原理还是挺巧妙的,值得学习一下。


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍