`
flyfly98
  • 浏览: 9075 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Java类加载器和JVM如何识别两个Java类相同

阅读更多

类加载器加载类的过程

类加载器在尝试自己去查找某个类的字节代码并定义它时,会先代理给其父类加载器,由父类加载器先去尝试加载这个类,依次类推。在介绍代理模式背后的动机之前,首先需要说明一下 Java 虚拟机是如何判定两个 Java 类是相同的。Java 虚拟机不仅要看类的全名是否相同,还要看加载此类的类加载器是否一样。只有两者都相同的情况,才认为两个类是相同的。即便是同样的字节代码,被不同的类加载器加载之后所得到的类,也是不同的。比如一个 Java 类 com.example.Sample,编译之后生成了字节代码文件 Sample.class。两个不同的类加载器 ClassLoaderAClassLoaderB分别读取了这个 Sample.class文件,并定义出两个 java.lang.Class类的实例来表示这个类。这两个实例是不相同的。对于 Java 虚拟机来说,它们是不同的类。试图对这两个类的对象进行相互赋值,会抛出运行时异常 ClassCastException

 

  因此注意,JVM识别两个Java类是否相同不仅仅是比较他们的字节码文件,这一点要注意了。。。

 

明白了这一点之后,就可以了解代理方式的设计动机了。代理方式是为了保证 Java 中心库的类型安全。一切 Java 使用都至少须要援用 java.lang.Object 类,也就是说在运转的时侯,java.lang.Object 这个类须要被加载到 Java 虚拟机中。假设这个加载流程由 Java 使用自己的类加载器来完成的话,很能够就存在多个版本的 java.lang.Object 类,并且这些类之间是不兼容的。议决代理方式,关于 Java 中心库的类的加载任务由引导类加载器来一致完成,保证了 Java 使用所运用的都是同一个版本的 Java 中心库的类,是互相兼容的。

分享到:
评论

相关推荐

    java类加载器

    两个类只有当它们来自相同的类加载器时才被认为是相同类的不同实例。这意味着即使两个类来自相同的`.class`文件,如果它们是由不同的类加载器加载的,它们也被认为是不同的类。 #### 四、双亲委派模型 Java类加载...

    深入Java虚拟机_002_深入详解JVM之类加载器深度剖析、根、扩展及系统类加载器

    根类加载器,也称为bootstrap class loader,是JVM内置的最基础的类加载器,由C++实现,负责加载JDK核心库,如rt.jar,这些库位于JRE的lib目录下,包含了Java的基础类和API。 扩展类加载器,又叫extension class ...

    Java面试题-内存+GC+类加载器+JVM调优.pdf

    在 Java 面试中,内存、GC、类加载器和 JVM 调优是非常重要的知识点,本文将对这些知识点进行详细的解释和分析。 一、Java 内存模型 在 Java 中,内存主要分为两部分:堆(Heap)和栈(Stack)。堆是存储对象的...

    Java类加载器.pdf

    例如,在提供的代码示例中,`Main`类通过`new A()`和`new B()`语句分别实例化了`A`和`B`类,这触发了类加载器对这两个类的加载过程。 #### 类加载器的层次结构 Java中的类加载器通常按照以下层次结构组织: 1. **...

    自定义Java类加载器

    4. **findResource(String name)** 和 **findResources(String name)**:这两个方法用于查找资源,如图片、配置文件等,它们不涉及类的加载,但可能在某些自定义类加载器中用到。 自定义类加载器的应用场景包括: ...

    Java类加载内幕详细讲解

    这意味着即使两个类具有相同的完全限定名,但如果它们是由不同的类加载器加载的,则被认为是两个不同的类。例如,对于包`com.example`中的类`MyClass`,如果它分别由类加载器`ClassLoader1`和`ClassLoader2`加载,则...

    java 静态代码块通过类加载器获取资源文件例子

    在Java编程中,静态代码块(Static Block)和类加载器(Class Loader)是两个重要的概念,它们在软件开发中有着广泛的应用。本案例聚焦于如何利用静态代码块结合类加载器来高效地获取资源文件,尤其是属性配置文件。...

    JAVA的类加载器的工作原理.docx

    JAVA类加载器的工作原理 JAVA类加载器是JAVA虚拟机(JVM)的一部分,负责...在JAVA面试题中,也经常出现“一个类是否能被两个不同类加载器加载”的问题。这是一个考察类加载器工作原理和JAVA类加载机制的重要问题。

    JAVA-JVM-01类加载机制

    3. `TestJDKClassLoader.class.getClassLoader().getClass().getName()` 和 `ClassLoader.getSystemClassLoader().getClass().getName()` 返回的都是应用程序类加载器,因为这两个类是应用自定义的。 在自定义类...

    Java类加载机制.doc

    这意味着即使两个类有相同的类全名,如果它们由不同的类加载器加载,那么在JVM中也会被视为不同的类。这种机制允许我们在同一个应用程序中使用多个版本的同一库,只要它们由不同的类加载器加载。 开发者可以通过...

    Java类加载机制

    例如,两个类 `C1` 和 `C2` 都来自同一个包 `Pg`,但分别由类加载器 `kl1` 和 `kl2` 加载,那么在 JVM 中,它们会被表示为 `(C1, Pg, kl1)` 和 `(C2, Pg, kl2)`,因此这两个类是不可互换的。 #### 四、类加载器的...

    java 类加载器学习笔记1

    JVM中存在两类加载器:启动类加载器(用C++编写)和其他类加载器(用Java实现)。从开发者的角度来看,还有BootStrapClassLoader、SystemClassLoader、ClassPathClassLoader以及自定义的类加载器。Java的设计允许...

    Java类加载内幕

    这意味着即使两个类具有相同的全限定名,只要它们由不同的类加载器加载,就会被认为是两个不同的类,并且它们的对象不能相互转换。 #### 三、类加载器概述 **类加载器的作用:** 类加载器负责将 Java 类从不同来源...

    java虚拟机简单原理jvm.pdf

    类加载器是 JVM 中的一个重要组件,它负责加载 Java 类文件并将其转换为 JVM 可以识别的格式。在 MiniJavaVM 中,类加载器使用了一个简单的类加载算法,通过读取 Java 类文件并将其转换为 bytecode。 执行引擎 ...

    java类加载机制

    在判断两个类是否相等时,必须确保这两个类是由同一个类加载器加载的,否则即使来源于同一个class文件,这两个类也被视为不相等。 ##### 3.1 双亲委派模型 双亲委派模型是Java类加载器的重要特性之一,它的基本...

    深入Java虚拟机JVM类加载学习笔记

    Java的堆内存可以划分为新生代(Young Generation)和老年代(Old Generation),新生代又进一步细分为Eden区和两个Survivor区(S0/S1)。 - **年轻代GC**: 主要针对的是短生命周期的对象进行回收。 - **老年代GC**: 主要...

    Java语言规范和JVM规范官网文档

    例如,JVM的堆内存分为年轻代和老年代,其中新生代又分为Eden区和两个Survivor区,这样的设计是为了优化垃圾回收效率。而方法区则存储类信息、常量、静态变量等数据。了解这些内存分区可以帮助我们更好地理解和调优...

    Java类加载机制学习1

    类加载器的隔离作用体现在,JVM判断两个类是否相同时,不仅看类的全名是否一致,还要看定义类加载器是否相同。这意味着不同类加载器加载的同名类在JVM中被视为不同的类,这为实现模块化和版本控制提供了基础。 在...

    Java类加载及SPI机制.pdf

    Java类加载机制和SPI(ServiceProviderInterface)机制是Java平台中极其重要的两个概念,它们对于Java程序的灵活性和可扩展性起到关键作用。下面详细解释这两个机制的概念、原理和应用场景。 类加载机制是Java...

Global site tag (gtag.js) - Google Analytics