1 、
java编译后的.class文件不同于C或者C++编译后形成的.exe文件,能够被window操作系统直接运行。而java程序的运行,首先是运行JVM(Java虚拟机),然后再把Java class加载到JVM里头一行,一行的解释运行,负责加载Java class的这部分就叫做Class Loader。
2、
jvm有三个重要的class loader
bootstrap Class Loaders负责装载java.*下的基本类
extension Class Loaders负责装载javax.*下的类
Application ClassLoader负责加载应用程序自身的类。
3
三者的关系是 ?
bootstrap class loaders是extension class loaders的父亲
extension class loaders是 Application ClassLoader的父亲
class loader的装载机制是parent delegate的模型。即类的装载是委托给父class loader去查找,如果没有找到才用当前的class loader来查找。
4
什么时候会加载java类文件呢?
当需要用到这个java类的时候,jvm会自动去加载这个类。当你使用java去执行一个类,JVM使用Application ClassLoader加载这个类;然后如果类A引用了类B,不管是直接引用还是用Class.forName()引用,JVM就会找到加载类A的ClassLoader,并用这个ClassLoader来加载类B。
5
加载类文件class.forname和ClassLoader.loadClass两个方法的区别
类的加载有下面的2种方式:
1、Class c1 = Class.forName ("java.lang.String");
2、ClassLoader ccl = new ClassLoader();
Class ccl.loadClass( String name, boolean resolve );
Class.forName是从指定的classloader中装载类,如果没有指定,也就是一个参数的时候,是从装载当前对象实例所在的classloader中装载类.
而ClassLoader的实例调用loadclass方法,是指从当前ClassLoader实例中调用类,而这个实例与装载当前所在类实例的Classloader也许不是同一个.
6
为什么我们要自己创建自己的classLoader呢?jvm不是给我们提供了吗?
似乎JVM自身的ClassLoader已经足够了,为什么我们还需要创建自己的ClassLoader呢?
因为JVM自带的ClassLoader只是懂得从本地文件系统加载标准的java class文件,如果编写你自己的ClassLoader,你可以做到:
1)在执行非置信代码之前,自动验证数字签名
2)动态地创建符合用户特定需要的定制化构建类
3)从特定的场所取得java class,例如数据库中
4) 等等
事实上当使用Applet的时候,就用到了特定的ClassLoader,因为这时需要从网络上加载java class,并且要检查相关的安全信息。
目前的应用服务器大都使用了ClassLoader技术,即使你不需要创建自己的ClassLoader,了解其原理也有助于更好地部署自己的应用。