类加载器与加载机制

布满荆棘的人生 2024-04-17 14:37 283阅读 0赞

类加载器:

执行”通过一个类的全限定名来获取描述此类的二进制字节流“这个步骤的代码模块称为“类加载器“,类加载器虽然只用于实现类的加载动作,但是他的作用不是仅限于此,在比较两个类是否”相等“的时候,只有在这两个类是由统一类加载器加载的前提下才有意义。否则,即使两个类源自同一个class文件,但是由不同的类加载器加载出来,他们也是不可能相等的。

类加载器主要有以下几种:

启动类加载器:

一般由本地代码实现,用于加载jvm的本地核心类库,主要负责加载在\lib目录下能被虚拟机识别的类库;

拓展类加载器:

主要负责加载\lib\ext目录下边的类库,开发者可以直接使用拓展类加载器。

应用程序类加载器:

它负责加载用户路径上所指定的类库,开发者可以直接使用这个类加载器。如果应用程序没有自己定义类加载器,一般情况下就是使用这个类加载器。

自定义类加载器:

这个类加载器我们可以自己去实现,根据自己的需求去进行类加载机制。通过继承java.lang.ClassLoader类重写findClass()方法。

  1. public class ClassLoaderTest extends ClassLoader{
  2. @Override
  3. protected Class<?> findClass(String name) throws ClassNotFoundException {
  4. // TODO Auto-generated method stub
  5. return super.findClass(name);
  6. }
  7. }

双亲委派模型:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1YWl4aWFvaGFpXzE_size_16_color_FFFFFF_t_70

这种模型当一个类收到类加载请求的时候,他首先会先把请求委派给父类加载器,然后一直向上传递,当传递到顶了以后,如果能加载那么加载完成,当父类无法完成加载的时候,类才会尝试自己加载。

看一下这个过程执行的代码:

  1. protected Class<?> loadClass(String name, boolean resolve)
  2. throws ClassNotFoundException
  3. {
  4. synchronized (getClassLoadingLock(name)) {
  5. // First, check if the class has already been loaded
  6. Class<?> c = findLoadedClass(name);
  7. if (c == null) {
  8. long t0 = System.nanoTime();
  9. try {
  10. if (parent != null) {
  11. c = parent.loadClass(name, false);
  12. } else {
  13. c = findBootstrapClassOrNull(name);
  14. }
  15. } catch (ClassNotFoundException e) {
  16. // ClassNotFoundException thrown if class not found
  17. // from the non-null parent class loader
  18. }
  19. if (c == null) {
  20. // If still not found, then invoke findClass in order
  21. // to find the class.
  22. long t1 = System.nanoTime();
  23. c = findClass(name);
  24. // this is the defining class loader; record the stats
  25. sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
  26. sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
  27. sun.misc.PerfCounter.getFindClasses().increment();
  28. }
  29. }
  30. if (resolve) {
  31. resolveClass(c);
  32. }
  33. return c;
  34. }
  35. }

但是双亲委派模型并不是强制的,当然这个模型也存在一些问题,为了更好的完成类加载过程,还推出了线程上下文加载器。

发表评论

表情:
评论列表 (有 0 条评论,283人围观)

还没有评论,来说两句吧...

相关阅读

    相关 机制

    类加载器: 执行”通过一个类的全限定名来获取描述此类的二进制字节流“这个步骤的代码模块称为“类加载器“,类加载器虽然只用于实现类的加载动作,但是他的作用不是仅限于此,...

    相关 ——

    虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作

    相关 机制

    一 点睛 1 类加载器负责将.class文件(可能在磁盘上,也可能在网络上)加载到内存中,并为之生成对应的java.lang.Class对象。 2 当JVM启动时,会形成由