您的位置:首页 > 编程语言 > Java开发

SpringBoot-Loader源码分析系列3: launch(args, getMainClass(), classLoader);

2017-01-05 00:00 621 查看
上一节,我们拿到了所有文件和class的一个classLoader实体类,下面进入正题。

===

首先,进入的是getMainClass函数,看到这个函数,我们就知道了要干嘛了,

还是先看看函数内容

@Override
protected String getMainClass() throws Exception {
//读取文件内容
Manifest manifest = this.archive.getManifest();
//
String mainClass = null;
if (manifest != null) {
//获取Start-Class属性
//
mainClass = manifest.getMainAttributes().getValue("Start-Class");
}
if (mainClass == null) {
throw new IllegalStateException(
"No 'Start-Class' manifest entry specified in " + this);
}
//返回内容
return mainClass;
}

至于这个值是什么呢?打印出debug的值

Step completed: "thread=main", org.springframework.boot.loader.ExecutableArchiveLauncher.getMainClass(), line=61 bci=16
61    			mainClass = manifest.getMainAttributes().getValue("Start-Class");

main[1] next
>
Step completed: "thread=main", org.springframework.boot.loader.ExecutableArchiveLauncher.getMainClass(), line=63 bci=26
63    		if (mainClass == null) {

main[1] print mainClass
mainClass = "zipkin.server.ZipkinServer"

这样,我们就顺利的拿到了主类: zipkin.server.ZipkinServer.

接下来执行

launch(args, mainClass, classLoader);

/**
* Launch the application given the archive file and a fully configured
* classloader.
*
* @param args
*            the incoming arguments
* @param mainClass
*            the main class to run
* @param classLoader
*            the classloader
* @throws Exception
*             if the launch fails
*/
protected void launch(String[] args, String mainClass, ClassLoader classLoader) throws Exception {
// 设置类加载器
Thread.currentThread().setContextClassLoader(classLoader);
//创建一个新的Runner
createMainMethodRunner(mainClass, args, classLoader).run();
}

重点在

createMainMethodRunner(mainClass, args, classLoader).run();

第一个没什么,就是创建一个MainMethodRunner对象,然后进入run方法。

---

public void run() throws Exception {
//看到这里了
//main[1] print mainClass
// mainClass = "class zipkin.server.ZipkinServer"
Class<?> mainClass = Thread.currentThread().getContextClassLoader()
.loadClass(this.mainClassName);
//然后获取主方法
//main[1] print mainMethod
// mainMethod = "public static void zipkin.server.ZipkinServer.main(java.lang.String[])"
Method mainMethod = mainClass.getDeclaredMethod("main", String[].class);
//触发方法,因为main是静态函数,所以第一个参数为null
mainMethod.invoke(null, new Object[] { this.args });
}

那么,下面我们就开始进入了public static void zipkin.server.ZipkinServer.main(java.lang.String[])

函数了,具体细节,下面再说。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Spring Boot
相关文章推荐