java类加载器

Java在需要使用类的時候,才會将类载入,Java类的载入是由类加载器(Class loader)來完成的。 
java类加载器_第1张图片  
JVM本身包含了一个ClassLoader称为Bootstrap ClassLoader,和JVM一 样,Bootstrap ClassLoader是用C++实现的,它负责加载 系统参数【sun.boot.class.path】 中指定的类(例如所有 java.* 开头的类)。 
个人电脑上,系统参数sun.boot.class.path对应的路径: 
C:\Program Files\Java\jdk1.6.0_16\jre\lib\resources.jar; 
C:\Program Files\Java\jdk1.6.0_16\jre\lib\rt.jar; 
C:\Program Files\Java\jdk1.6.0_16\jre\lib\sunrsasign.jar; 
C:\Program Files\Java\jdk1.6.0_16\jre\lib\jsse.jar; 
C:\Program Files\Java\jdk1.6.0_16\jre\lib\jce.jar; 
C:\Program Files\Java\jdk1.6.0_16\jre\lib\charsets.jar; 
C:\Program Files\Java\jdk1.6.0_16\jre\classes 
为什么不需要在classpath中加载这些类,原因就是在JVM启动的时候就自动加载了,并且在运行过程中根本不能修改Bootstrap加载路径。  

另外JVM还 会提供两个ClassLoader,它们都是用Java语言编写的,由Bootstrap ClassLoader加载;其中 Extension ClassLoader它负责加载 系统参数【java.ext.dirs】 中指定的类(例如所有 javax.* 开头的类和存放在JRE的ext目录下的 类) 
个人电脑上,系统参数java.ext.dirs对应的路径: 
C:\Program Files\Java\jdk1.6.0_16\jre\lib\ext; 
C:\Windows\Sun\Java\lib\ext 

Application ClassLoader负责加载 系统参数【java.class.path】 中指定的类,也就是用来 加载Classpath所指定的路径下相关的类 。 

似乎JVM自身的ClassLoader已经足够了,为什么我们还需要创建自己的ClassLoader呢? 
因为JVM自带的ClassLoader只是懂得从本地文件系统加载标准的java class文件,如果编写你自己的ClassLoader,你可以做到: 
1)在执行非置信代码之前,自动验证数字签名 
2)动态地创建符合用户特定需要的定制化构建类 
3)从特定的场所取得java class,例如数据库中 
4) 等等 
事实上当使用Applet的时候,就用到了特定的ClassLoader,因为这时需要从网络上加载java class,并且要检查相关的安全信息。 

当你决定创建你自己的ClassLoader时,需要继承java.lang.ClassLoader或者它的子类。在实例化每个ClassLoader 对象时,需要指定一个父对象;如果没有指定的话,系统自动指定ClassLoader.getSystemClassLoader()为父对象 
在Java 1.2后,java class的加载采用所谓的委托模式(Delegation Modle),当调用一个ClassLoader.loadClass()加载一个类的时候,将遵循以下的步骤: 
1)检查这个类是否已经被加载进来了? 
2)如果还没有加载,调用父对象加载该类 
3)如果父对象无法加载,调用本对象的findClass()取得这个类。 

所以当创建自己的Class Loader时,只需要重载 findClass() 这个方法。 

你可能感兴趣的:(java)