Java虚拟机(六):Java编程和执行过程

来源:互联网 发布:网络的攻击与防范 编辑:程序博客网 时间:2024/05/02 00:16
Java虚拟机(六):Java编程和执行过程
分类: Java_JVM 92人阅读 评论(0) 收藏 举报
Java编译Java执行classLoaderforName

Java编程和执行的整个过程包含了3个重要的机制

1.编译机制

2.类加载机制

3.类执行机制

一.编译机制

       编译机制的作用主要是将.java文件转换为.class文件。其中转换后的.class包含了元数据,方法信息等一些信息。比如说元数据就包含了Java文件中声明的常量,也就是我们所说的常量池。方法信息就包含了Java文件中声明的方法,表达式语句等。

二.类加载机制

2.1类如何进行加载

JVM是通过一个称为ClassLoader东西来加载class文件的,每当JVM启动,它就会生成三个ClassLoader,它们分别是Bootstrap Loader,ExtClassLoaderAppClassLoader。这三个ClassLoader作用是不同的,它们所加载的class文件也是不同的。

(1)Bootstrap Loader它所加载的是JVM中最底层的类

(2)ExtClassLoader是用来加载Java的一些库的

(3)AppClassLoader也称System ClassLoader,它的搜索路径是由java.class.path来指定的

JVM加载class文件时采用了双亲委托模型,当需要加载一个class文件时,JVM会首先让这个加载器的父亲去加载,如果父亲无法加载,JVM会让父亲的父亲去加载,如果仍然无法加载,则让最初的加载器去加载。这三个加载器的委托关系如图:

从上图可以看出,每当加载我们自己所编写的class文件时,首先会交给AppClassLoader的父亲ExtClassLoader去加载,如果它不能加载则会交给ExtClassLoader的父亲Bootstrp Loader去加载,如果仍无法加载的情况下则交给AppclassLoader加载。

在加载完Class文件之后,ClassLoader如何将class文件变成一个java类的。在ClassLoader类中有一个非常重要的方法叫findClass,它接收要加载的类的名字作为它的参数,在该方法里会找到class文件并读取文件中的内容到一个byte数组,然后再调用另外一个重要的方法defineClass,该方法能够将byte数组中的内容转化成一个相应的Class ObjectdefineClass方法的调用是通过JNI方式的,它的实现是用C++语言实现的本地化方法。


2.2对于类的加载方式

主要有两种方法:一种是隐式的,一种是显示的。

对于隐式的方法:主要是使用new关键字。

对于显示的方法:可以由java.lang.Class的forName()方法加载,也可以由java.lang.ClassLoader的loadClass()方法加载。

(1)ClassLoader.loadClass():使用指定的Classloader进行装载,结果返回一个类。

(2)Class.forName():使用当前类的Classloader进行装载,结果也是返回一个类


2.3类加载的委托机制的好处-安全性

JVM装载类使用的是“全盘负责委托机制”。

全盘负责,指当一个ClassLoader装载类的时候,除非显示的使用另外一个ClassLoader,该类所依赖和引用的其他类都有这个ClassLoader载入。

委托机制,指先委托父转载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载类,这一点是从安全角度考虑的,试想如果有人编写了一个恶意的基础类,比如String类,并装载到JVM中将会引起多么可怕的后果呢。但是,由于有了全盘负责委托机制,String类永远是有根装载器装载,这样就避免了事件的发生。另外,我们经常遇到的NoSuchMethodError错误往往就是因为加载了不同版本的包造成的。

三.类的执行机制

JVM是基于栈的体系结构来执行class字节码的。线程创建后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行的指令在方 法内的偏移量,栈中存放一个个栈帧,每个栈帧对应着每个方法的每次调用,而栈帧又是有局部变量区和操作数栈两部分组成,局部变量区用于存放方法中的局部变 量和参数,操作数栈中用于存放方法执行过程中产生的中间结果。

四.参考

1.http://blog.csdn.net/cutesource/article/details/5904542

2.http://blog.csdn.net/linyajun/article/details/3729121

0 0
原创粉丝点击