Java中类加载器的特点有哪些

发布时间:2021-07-19 18:03:34 作者:Leah
来源:亿速云 阅读:269

Java中类加载器的特点有哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

Java类加载器的特性:

每个ClassLoader都维护了一份自己的名称空间, 同一个名称空间里不能出现两个同名的类。

为了实现java安全沙箱模型顶层的类加载器安全机制, java默认采用了 " 双亲委派的加载链 " 结构。

类图中, BootstrapClassLoader是一个单独的java类, 其实在这里, 不应该叫他是一个java类。因为,它已经完全不用java实现了。它是在jvm启动时, 就被构造起来的, 负责java平台核心库。

自定义类加载器加载一个类的步骤

ClassLoader 类加载逻辑分析, 以下逻辑是除 BootstrapClassLoader 外的类加载器加载流程:

// 检查类是否已被装载过  Class c = findLoadedClass(name);  if (c == null ) {  // 指定类未被装载过  try {  if (parent != null ) {  // 如果父类加载器不为空, 则委派给父类加载  c = parent.loadClass(name, false );  } else {  // 如果父类加载器为空, 则委派给启动类加载加载  c = findBootstrapClass0(name);  }  } catch (ClassNotFoundException e) {  // 启动类加载器或父类加载器抛出异常后, 当前类加载器将其  // 捕获, 并通过findClass方法, 由自身加载  c = findClass(name);  }  }

线程上下文类加载器

java默认的线程上下文类加载器是 系统类加载器(AppClassLoader)。

//Now create the class loader to use to launch the application  try {  loader = AppClassLoader.getAppClassLoader(extcl);  } catch(IOException e) {  throw new InternalError(  "Could not create application class loader" );  }  //Also set the context class loader for the primordial thread.  Thread.currentThread().setContextClassLoader(loader);

Java代码

//Now create the class loader to use to launch the application  try {  loader = AppClassLoader.getAppClassLoader(extcl);  } catch (IOException e) {  throw new InternalError(  "Could not create application class loader" );  }  //Also set the context class loader for the primordial thread.  Thread.currentThread().setContextClassLoader(loader);

以上代码摘自sun.misc.Launch的无参构造函数Launch()。使用线程上下文类加载器, 可以在执行线程中, 抛弃双亲委派加载链模式, 使用线程上下文里的类加载器加载类.典型的例子有, 通过Java类加载器上下文来加载第三方库jndi实现, 而不依赖于双亲委派.大部分java app服务器(jboss, tomcat..)也是采用contextClassLoader来处理web服务。还有一些采用 hotswap 特性的框架, 也使用了线程上下文类加载器, 比如 seasar (full stack framework in japenese).

线程上下文从根本解决了一般应用不能违背双亲委派模式的问题.使java类加载体系显得更灵活.随着多核时代的来临, 相信多线程开发将会越来越多地进入程序员的实际编码过程中. 因此,在编写基础设施时, 通过使用线程上下文来加载类, 应该是一个很好的选择。当然, 好东西都有利弊. 使用线程上下文加载类, 也要注意, 保证多根需要通信的线程间的类加载器应该是同一个,防止因为不同的类加载器, 导致类型转换异常(ClassCastException)。

为什么要使用这种双亲委托模式呢?

因为这样可以避免重复加载,当父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

推荐阅读:
  1. java中的抽象类有什么特点
  2. java的类加载器有哪些

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Java 中怎么利用Runnable线程编写接口

下一篇:python中PaddleOCR库的用法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》