JVM系列十三(类加载器).
2020-04-16 16:10:28来源:博客园 阅读 ()
JVM系列十三(类加载器).
一、概述
类加载器通过一个类的全限定名来获取描述此类的二进制字节流。
类加载器在类层次划分、OSGi、热部署、代码加密等领域发挥着重要的作用。
比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提之下才有意义,否则,即使这两个类是来源于同一个 Class 文件,只要加载它们的类加载器不同,那这两个类就必定不相等。这里的“相等”包括 equal() 方法、isAssignableForm() 方法、isInstance() 方法和 instanceof 关键字。
下面的例子可以看到,虽然都是来自同一个 Class 文件,但是因为类加载器不同,依然是两个独立的类,自然不会“相等”。
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
// 自定义简单类加载器
ClassLoader myClassLoader = new ClassLoader() {
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
try {
String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
InputStream inputStream = getClass().getResourceAsStream(fileName);
if (inputStream == null) {
return super.loadClass(name);
}
byte[] bytes = new byte[inputStream.available()];
inputStream.read(bytes);
return defineClass(name, bytes, 0, bytes.length);
} catch (IOException e) {
e.printStackTrace();
}
return super.loadClass(name);
}
};
Object newInstance = myClassLoader.loadClass("org.jvm.demo.chapter7.ClassLoaderTest").newInstance();
System.out.println(newInstance.getClass()); // org.jvm.demo.chapter7.ClassLoaderTest
System.out.println(newInstance instanceof org.jvm.demo.chapter7.ClassLoaderTest); // false
}
绝大部分 Java 程序都会使用到以下三种系统提供的类加载器:
- 启动类加载器(Bootstrap ClassLoader):负责加载 JAVA_HOME\lib 或着 -Xbootclasspath 参数指定目录下的类库,加载内容按文件名识别,如 rt.jar,启动类加载器无法被 Java 程序直接引用。
- 扩展类加载器(Extension ClassLoader):负责加载 JAVA_HOME\lib\ext 或者 java.ext.dirs 系统变量所指定的所有类库,该加载器由 sun.misc.Launcher$ExtClassLoader 实现,开发者可以直接使用扩展类加载器 — Launcher.getLauncher().getClassLoader()。
- 应用程序类加载器(Application ClassLoader):负责加载用户类路径 ClassPath 上所指定的类库,如果应用程序没有自定义过自己的类加载器,一般情况下就是程序的默认类加载器,该加载器由 sun.misc.Launcher$AppClassLoader 实现,开发者可以直接使用这个类加载器 — ClassLoader.getSystemClassLoader()。
二、双亲委派模型
如图所示类加载器之间的层次关系,就称为类加载器的双亲委派模型。双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。这里类加载器之间的父子关系一般不会以继承的关系来实现,而是都使用组合关系来复用父加载器的代码。
双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此。
双亲委派模型对于保证 Java 程序的稳定运作很重要,它让 Java 类随着它的类加载器一起具备了一种带有优先级的层次关系。
双亲委派模型不是一个强制性的约束模型,而是 Java 设计者们推荐给开发者们的一种类加载器的实现方式。
原文链接:https://www.cnblogs.com/jmcui/p/12707131.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Spring系列.ApplicationContext接口 2020-06-11
- JVM常见面试题解析 2020-06-11
- logstash系列-入门整理 2020-06-10
- 秒懂系列,超详细Java枚举教程!!! 2020-06-08
- 【JVM故事】了解JVM的结构,好在面试时吹牛 2020-06-06
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash