Java的反射机制(一)




从图中可以看到对于一个XXX.class文件 是由ClassLoader将其加载进内存的代码段   然后找到函数入口点     对于XXX.class文件中的所用到的yyy zzz类 则不是一次加载完毕,而是动态的加载即扫描到后才加载


对于上面提到的ClassLoader类加载器其实是非常重要的东西了解它有助于我们了解Jvm的执行过程

在控制台下当我们打入 java HelloWorld时会进行大致如下的工作:

1.找到jvm.dll 初始化JVM  我的电脑下的路径为:B:\Java\jdk1.7.0_45\jre\bin\jvm.dll

2.产生一个启动类加载器

3.启动类加载器自动加载一个标准扩展类加载器  

4.启动类加载器自动加载一个系统类加载器

5.最后由系统类加载器加载我们的HelloWorld类

简单的过程大致如上


其中

1.启动类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的 貌似是c实现

而且固化在了JVM上了

2.扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类

3.系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类.一般来说,Java 应用的类都是由它来完成加载的.可以通过 ClassLoader.getSystemClassLoader() 来获取它

类加载器的委托加载原理,首先加载类一直交给父类加载器加载,一直提交到bootstrap,当父类加载器加载不到时,在一层层的返回给下一级加载器加载(不是Super,不是继承关系)

1.运行一个程序时,总是由AppClass Loader(系统类加载器)开始加载指定的类。
2.在加载类时,每个类加载器会将加载任务上交给其父,如果其父找不到,再由自己去加载。
3.Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为null.

对于加载类的获取:

由于Bootstrap Loader是由c语言实现的所以这里返回null

类的加载方式有三种:
1.命令行启动应用时候由JVM初始化加载
2.通过Class.forName()方法动态加载
3.通过ClassLoader.loadClass()方法动态加载
第二种和第三种还是有差别的 实例如下


关于上述加载器的加载路径问题

在JVM源代码中这样写道:

static const char classpathFormat[] =

"%/lib/rt.jar:"

"%/lib/i18n.jar:"

"%/lib/sunrsasign.jar:"

"%/lib/jsse.jar:"

"%/lib/jce.jar:"

"%/lib/charsets.jar:"

"%/classes";

这就是Bootstrap加载路径

Extension ClassLoader用来加载扩展类,即/lib/ext中的类。

最后AppClassLoader才是加载Classpath的。

另外推荐一篇比较好的文章关于类器:

http://www.blogjava.net/jjshcc/archive/2011/12/27/367309.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值