SpringBoot-Loader源码分析系列3: launch(args, getMainClass(), classLoader);
2017-01-05 00:00
621 查看
上一节,我们拿到了所有文件和class的一个classLoader实体类,下面进入正题。
===
首先,进入的是getMainClass函数,看到这个函数,我们就知道了要干嘛了,
还是先看看函数内容
至于这个值是什么呢?打印出debug的值
这样,我们就顺利的拿到了主类: zipkin.server.ZipkinServer.
接下来执行
重点在
createMainMethodRunner(mainClass, args, classLoader).run();
第一个没什么,就是创建一个MainMethodRunner对象,然后进入run方法。
---
那么,下面我们就开始进入了public static void zipkin.server.ZipkinServer.main(java.lang.String[])
函数了,具体细节,下面再说。
===
首先,进入的是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[])
函数了,具体细节,下面再说。
相关文章推荐
- SpringBoot-Loader源码分析系列2:启动 new JarLauncher().launch(args)的.launch(args)部分
- 分析Java的类加载器与ClassLoader(二):classpath与查找类字节码的顺序,分析ExtClassLoader与AppClassLoader的源码
- 类路径分析Java的类加载器与ClassLoader(二):classpath与查找类字节码的顺序,分析ExtClassLoader与AppClassLoader的源码
- 分析Java的类加载器与ClassLoader(二):classpath与查找类字节码的顺序,分析ExtClassLoader与AppClassLoader的源码
- WinCE6.0 BootloaderMain源码分析之OEMLaunch
- Tomcat源码分析之ClassLoader部分的设计详细分析
- getClass()和getClassLoader()区别 以及ClassLoader详解及用途(文件加载,类加载)
- Linux-0.11内核源码分析系列:内存管理get_free_page()函数分析
- ClassLoader源码分析
- JAVA源码分析之---Object类(一)---registerNatives,getClass方法的使用
- Class.getResource和ClassLoader.getResource区别与分析
- ClassLoader源码分析
- Class.getResource和ClassLoader.getResource的区别分析
- classloader之getresource,findClass深度分析
- Class.getResource和ClassLoader.getResource的区别分析
- java虚拟机类加载过程内存情况底层源码分析及ClassLoader讲解
- Linux-0.11内核源码分析系列:内存管理get_empty_page()与put_page()函数分析
- Java的ClassLoader分析与Jettty的WebAppClassLoader
- Jetty class loader 类加载过程源码分析初稿
- Class.getResource和ClassLoader.getResource的区别分析