代码执行流程
编译器:可以用来检查一些源码的错误,如语法错误,类型错误等。但运行时的错误需要等到代码执行时才能发现,编译阶段是无法发现的。
如IDEA、Eclipse等不是编译器吧,这只是编译的工具。真正实现编译功能的还是javac命令吧,而javac命令取决于JDK版本,可以通过设置不同的java编译版本,来编译当前代码。
Java虚拟机:是通过运行java命令启动的。一个main方法将会启动一个java虚拟机。
我们常用的编码工具如IDEA,其实隐藏了javac和java命令,取而代之的是编译和运行按钮。
入口程序
1、要想运行java程序,就必须得有程序入口main。
2、在一个应用程序中只能有一个main方法。
javac编译后才会调用java进行执行,执行入口为main方法。此时会涉及到.class文件的load工作:
如果是当前类,那么直接通过ClassLoader中的loadClass()方法进行加载。加载的过程是:findLoadedClass()-->parent.loadClass()-->currentLoader.loadClass()。【先从父加载器中加载,再从当前加载器中加载。Launcher.BootstrapClassPath-->Launcher.ExtClassLoader-->Launcher.AppClassLoasder】
当然如果是其它类的加载,可以通过extends ClassLoader并override findClass或者loadClass来指定如何加载该class,一般是将该name当做一个资源路径URL(注意区别于URI,URI包括所有的URL,但email地址等并非URL)加载并得到Resource对象,从而转化成Class对象。
如果是其它资源的加载,可以通过ClassLoader中的getResources(String name)加载,getResource会将name作为一个资源文件路径,去classPath(包括bootstrapClassPath和当前application下的classPath)中找到所有包含name的资源文件,并返回得到Class对象。
Java编译器与Java虚拟机
Java虚拟机与编译器各司其职,让java运行得更快。编译运行,而非解释运行。如果没有编译器,那么java必须一边解释纯人类语言的代码,一边运行。有了编译器,java可以一边解释字节码(接近机器语言)文件,一边运行。