昨天在手写spring框架的时候出现了个问题,就是由于类加载器使用错误的问题导致代理对象创建失败,所有有了这个疑问。
希望有大神能够给讲一下哈
类加载器(ClassLoader)与当前类是什么关系
类加载器基于双亲委派模型会划分为:启动类加载器(加载jdk的jar)、扩展类加载器(加载扩展包下的jar)、应用程序类加载器(加载用户编写的class文件)。当你不手动指定类加载器时,默认都是使用应用程序类加载器,来加载我们的类。当前类与类加载器之间的关系,就是加载与被加载的关系,应用程序将类加载到内存中,供使用,具体参考上面的回答。
类加载器什么时候用呢?
java类的声明周期是这样的java文件经过编译器编译变成class文件---->class文件被类加载器加载到jvm中------>验证class文件是否有效------->做准备工作------>解析阶段------->初始化类信息------->使用类信息------->卸载类信息。这是整个java文件的声明周期,类加载器就是在类加载到jvm阶段中使用的,
怎么用?
用的话,就是基于双亲委派模型来使用,当前的类加载器收到类加载器请求会先去询问他的父级累加器能不能加载,依次向上递归,若是都不能加载再依次交给子类,这个过程不需要我们人为参与,jvm已经帮我们做了。
这个问题真不是一两句能说清的。首先JAVA中类加载采用的双亲委派机制(请自行查资料),当前类和类加载器的关系是,类加载器从class文件中或者IO中读取class,class中有类的描述信息,包括里面的字段、方法、静态常量等等……
读取后把它加载到内存中,比如:会在元数据空间建立一个代表某个类的Class对象。反正一句话:类加载器的作用就是加载类(好像是废话),因为JVM是无法直接识别的你的xxx.class的,需要把它加载到虚拟机内存解析出来才能识别。
第二个问题:”何时加载?“参考下图:
### 以上回答基于JDK8