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的实现原理还是挺巧妙的,值得学习一下。


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

成人本科学士学位英语统一考试星级词汇大冲关(第2版 乱序版)
¥18.09
年年好1.2米丝绒布全背胶金字对联《贺岁呈祥》2023兔年不带福字
¥19.90
若烟雪茄保湿包加湿包片保湿袋69%湿度双向保湿恒湿四季通用 便携8g
¥14.00
喜宝莉一次性加厚洗珍珠纹洗脸巾干湿两用抽取式60片加厚加大200*200mm
¥13.93
富昌 虾皮200g 小虾米海米干 海产干货紫菜蛋花汤原材料 调味食材
¥24.90
绿联 苹果数据线MFi认证 快充充电线适用iPhone14/13Pro/12/11/X/8/iPadi手机Lightning充电器USB电源线1米
¥46.90
诺伯豪斯 口罩医用柳叶鱼型独立包装 时尚网红情侣口罩男女 含熔喷布医用口罩 夏花粉30枚
¥28.00
年年好1.2米*5付空白手写对联《经典版》2023兔年通用
¥27.90