首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

由ClassLoader加载的两个类,它们不能相互调用

是因为它们被加载到不同的命名空间中。ClassLoader是Java虚拟机(JVM)的一部分,用于加载Java类文件到内存中并执行。每个ClassLoader都有自己的命名空间,用于隔离不同的类加载器加载的类。

当一个类被加载到内存中时,它会被分配一个唯一的标识符,称为全限定名(Fully Qualified Name)。这个全限定名由类的包名和类名组成。不同的ClassLoader加载同一个类时,会生成不同的全限定名,即使这两个类的字节码内容完全相同。

由于ClassLoader加载的两个类位于不同的命名空间中,它们无法相互调用。这是因为Java虚拟机在解析类名时会使用ClassLoader的命名空间来查找类,如果两个类不在同一个命名空间中,虚拟机无法找到对应的类。

然而,如果两个类之间需要相互调用,可以通过接口或反射机制来实现。接口可以定义类之间的通信协议,使得不同命名空间中的类可以通过接口进行交互。反射机制可以在运行时动态地加载和调用类,使得不同命名空间中的类可以通过反射调用对方的方法。

总结起来,由ClassLoader加载的两个类不能相互调用是因为它们被加载到不同的命名空间中。但可以通过接口或反射机制来实现类之间的交互。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JAVA ClassLoader双亲委派机制细节研究

这个 ClassLoader 比较特殊,它是 C 代码实现,我们将它称之为“根加载器”。...最后补充一下加载命名空间:每个加载器对应一个命名空间,命名空间起到了一个相互隔离作用。...而关于不同类加载器对应命名空间中之间可见性如下(参考): 同一个命名空间内相互可以见加载命名空间包含所有父加载命名空间。因此加载加载能看见父加载加载。...加载加载不能看见子加载加载。...如果两个加载器之间没有直接或间接父子关系,那么它们各自加载相互不可见 最后,需要强调是,双亲委派模型也并非是完美无缺,一些特殊场景下,是没有遵守双亲委派机制,详见参考博客9~11。

34030

深入理解JVM虚拟机---双亲委托模型

加载动作 隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用装载器加载对应到jvm中。...命名空间 每个加载器都有自己命名空间,命名空间加载器及所有父加载组成 在同一个命名空间中,不会出现完整名字(包括包名)相同两个 在不同命名空间中,可能出现完整名(包括包名...)相同两个 不同类加载命名空间关系 同一命名空间相互可见 子类命名空间包含所有父加载命名空间。...因此加载加载能看见父加载加载,例如系统加载加载能看见根加载加载 加载加载不能看见子加载加载 如果两个加载器之间没有直接或间接父子关系,那么它们各自加载相互不可见...这就改变了父ClassLoader不能使用子ClassLoader或其他没有直接父子关系ClassLoader加载情况,即改变了双亲委托模型。

74420
  • Tomcat 加载机制

    时需要指定自己 parent 是谁 (2)先检查是否已经被加载过,如果类已经被加载了,直接返回 (3)若没有加载调用加载器 parent loadClass() 方法进行加载 (4)若父加载器为空则默认使用启动加载器...bootstrap ClassLoader 进行加载 (5)如果父加载失败,抛出 ClassNotFoundException 异常后,再调用自己 findClass() 方法进行加载。...⻅,这些应⽤程序不能访问; (3)Shared Classloader加载 share.loader 属性下jar,默认未配置路径,返回其父加载器即 Common ClassLoader,主要是加载应...,才会真正建立 Catalina ClassLoader 和 Shared ClassLoader 实例,否则在用到这两个加载地方都会用 Common ClassLoader 实例代替,而默认配置文件中是没有设置这两个...(4)如果没有加载成功,WebAppClassLoader 就会调用自己 findClass() 方法自己来对进行加载,先在 WEB-INF/classes 中加载,再从 WEB-INF/lib

    83110

    虚拟机加载机制(2)——加载

    这句话意思就是说,比较两个是否相等不能光看他们本身来自同一个,同时也要看加载它们加载器是否相同。...扩展加载器(Extension ClassLoader),这个加载Java实现,独立于虚拟机外部,继承至java.lang.ClassLoader抽象。...应用程序加载(Application ClassLoader),也称之为系统加载器,同样也Java实现,独立于虚拟机外部,继承至java.lang.ClassLoader抽象。...负责加载用户路径(ClassPath)上所指定库。开发者可直接使用这个加载器。 以上3种加载器(当然也可以自定义加载器)它们是如何相互配合进行加载呢?...,这不符合我们预期,这也正是我们在开头所提到两个是否相等需要由加载加载器和这个本身一同确立。

    68260

    Tomcat 加载器打破双亲委派模型

    这句话可以表达更通俗一些:比较两个是否“相等”,只有在这两个同一个加载加载前提下才有意义,否则,即使这两个来自同一个Class文件,被同一个虚拟机加载,只要加载他们加载器不同,那这个两个就必定不相等...我们说,双亲委派模型很好解决了各个加载基础统一问题(越基础越上层加载器进行加载),基础之所以称为“基础”,是因为它们总是作为被用户代码调用API, 但没有绝对,如果基础调用会用户代码怎么办呢...一个典型例子就是JNDI服务,JNDI现在已经是Java标准服务,它代码启动加载器去加载(在JDK1.3时就放进去rt.jar),但它需要调用独立厂商实现并部署在应用程序ClassPath...一个web容器可能需要部署两个应用程序,不同应用程序可能会依赖同一个第三方不同版本,不能要求同一个库在同一个服务器只有一份,因此要保证每个应用程序库都是独立,保证相互隔离。 2....和SharedClassLoader使用,从而实现了公有共用,而CatalinaClassLoader和Shared ClassLoader自己能加载则与对方相互隔离。

    1.9K30

    JAVA之ClassLoader

    它到指定文件系统或网络等URL中加载该类。...3,如何判断两个class相同 JVM在判定两个class是否相同时,不仅要判断两个名是否相同,而且要判断是否同一个加载器实例加载。...只有两者同时满足情况下,JVM才认为这两个class是相同。就算两个class是同一份class字节码,如果被两个不同ClassLoader实例所加载,JVM也会认为它们两个不同class。...和ClassLoaderB这两个加载器并读取了NetClassLoaderSimple.class文件,并分别定义出了java.lang.Class实例来表示这个,对于JVM来说,它们两个不同实例对象...为了将请求委托给父ClassLoader,这个新方法允许ClassLoader获取它ClassLoader.当使用特殊方法,定制ClassLoader不能找到时,可以使用这种方法。

    62290

    通过源码浅析Java中资源加载

    上面这句话直观来说就是:比较两个是否"相等",只有在这两个同一个加载加载前提下才有意义,否则,即使这个两个是来源于同一个Class文件,被同一个虚拟机加载,只要加载它们加载器不同,那么这两个必然...2、另一种是其他加载器,这些加载器都是Java语言实现,独立于虚拟机之外,一般就是内部于JDK中,它们都继承自抽象加载器java.lang.ClassLoader。...3、应用程序加载器(Application ClassLoader):这个加载sun.misc.Launcher静态内部类AppClassLoader实现,但是由于这个加载实例是ClassLoader...Java开发者开发出来Java应用程序都是上面四种加载相互配合进行加载,如果有必要还可以加入自定义加载器。...2、双亲委派模型自身存在缺陷:双亲委派很好地解决了各个加载基础加载统一问题(越基础越上层加载加载),这些所谓基础就是大多数情况下作为用户调用基础库和基础API,但是无法解决这些基础需要回调用代码这一个问题

    69810

    深入JVM加载器机制,值得你收藏

    $AppClassLoader JVM加载器机制是什么 JVM加载机制主要分为三种,这三种加载机制相互配合,保证了JVM加载完整性,正确性,可扩展性。...第二次:Java应用程序中一般都是上层调用下层,核心API总是被作为最底层来提供服务,它们总是基础,那么有没有可能基础调用上层,比如Integer调用开发人员写Java呢,这是有可能事情,一个典型例子就是...JNDI,JNDI现在已经是Java标准服务,它代码启动加载器去加载(在JDK1.3时放进rt.jar),但JNDI目的就是对资源进行集中管理和查找,它需要调用独立厂商实现部部署在应用程序classpath...Class.forName(StringclassName),Classloader.loadClass(StringclassName)这两个方法入参都是全限定名,两个方法都被重载了,重载后的如下方法如下...,比如Java.lang.String,不能对一个.class文件或者一个不在程序引用里.jar包中进行创建。

    61020

    Springboot Application 集成 OSGI 框架开发

    它到指定文件系统或网络等 URL 中加载该类。...如果它们都没有加载到这个时,则抛出 ClassNotFoundException 异常。否则将这个找到生成一个定义,并将它加载到内存当中,最后返回这个在内存中 Class 实例对象。...判别两个是否相同,除了是相同 class 字节码,还必须由同一加载加载。...并分别定义出了 java.lang.Class 实例来表示这个,对于 JVM 来说,它们两个不同实例对象,但它们确实是同一份字节码文件,如果试图将这个 Class 实例生成具体对象进行转换时,就会抛运行时异常...Spring boot 应用中嵌入 OSGI 开发和 Spring boot 应用如何与 OSGI 插件之间进行相互调用

    1.4K20

    Tomcat如何打破双亲委派机制实现隔离Web应用

    若在Tomcat运行两个Web应用程序,它们有功能不同同名Servlet,Tomcat需同时加载和管理这两个同名Servlet,保证它们不会冲突。...SharedClassLoader 两个Web应用之间怎么共享库,并且不能重复加载相同? 双亲委派机制各子加载器都能通过父加载器去加载,于是考虑把需共享放到父加载加载路径。...CatalinaClassLoader 如何隔离Tomcat本身和Web应用? 兄弟关系:两个加载器是平行它们可能拥有同一父加载器,但两个兄弟加载加载是隔离。...能加载则与对方相互隔离。...Spring加载问题 JVM默认情况下,若一个加载器A加载,则该类依赖相同加载加载

    1.2K20

    Tomcat如何打破双亲委派机制实现隔离Web应用

    若在Tomcat运行两个Web应用程序,它们有功能不同同名Servlet,Tomcat需同时加载和管理这两个同名Servlet,保证它们不会冲突。...SharedClassLoader 两个Web应用之间怎么共享库,并且不能重复加载相同? 双亲委派机制各子加载器都能通过父加载器去加载,于是考虑把需共享放到父加载加载路径。...CatalinaClassLoader 如何隔离Tomcat本身和Web应用? 兄弟关系:两个加载器是平行它们可能拥有同一父加载器,但两个兄弟加载加载是隔离。...能加载则与对方相互隔离。...Spring加载问题 JVM默认情况下,若一个加载器A加载,则该类依赖相同加载加载

    1.7K10

    Java ClassLoader 透析

    AppClassLoader 可以 ClassLoader 提供静态方法 getSystemClassLoader() 得到,它就是我们所说「系统加载器」,我们用户平时编写代码通常都是加载...虚拟机策略是使用调用者 Class 对象 ClassLoader加载当前未知。何为调用者 Class 对象?...Class.forName vs ClassLoader.loadClass 这两个方法都可以用来加载目标它们之间有一个小小区别,那就是 Class.forName() 方法可以获取原生类型 Class...钻石依赖 项目管理上有一个著名概念叫着「钻石依赖」,是指软件依赖导致同一个软件包两个版本需要共存而不能冲突。 ?...(depv2Class) 我们还可以让两个不同版本 Dep 实现同一个接口,这样可以避免使用反射方式来调用 Dep 里面的方法。

    51020

    老大难 Java ClassLoader,到了该彻底理解它时候了

    AppClassLoader 可以 ClassLoader 提供静态方法 getSystemClassLoader() 得到,它就是我们所说「系统加载器」,我们用户平时编写代码通常都是加载...虚拟机策略是使用调用者 Class 对象 ClassLoader加载当前未知。何为调用者 Class 对象?...Class.forName vs ClassLoader.loadClass 这两个方法都可以用来加载目标它们之间有一个小小区别,那就是 Class.forName() 方法可以获取原生类型 Class...钻石依赖 项目管理上有一个著名概念叫着「钻石依赖」,是指软件依赖导致同一个软件包两个版本需要共存而不能冲突。 ?...(depv2Class) 我们还可以让两个不同版本 Dep 实现同一个接口,这样可以避免使用反射方式来调用 Dep 里面的方法。

    82730

    理解装载器

    一般来说,Java 应用都是它来完成加载,可以通过 ClassLoader.getSystemClassLoader() 来获取它。...除了Bootstrap ClassLoader,其余加载器本身也其它加载器进行加载,所以某个加载加载器就是加载了这个加载那个加载器。...我想让启动加载加载一个由我书写名为java.lang.Attack带有攻击代码,那么我攻击能成功吗?答案是不能。因为对于不同加载器所加载它们将属于不同运行时包。...运行时包这个词在《Java虚拟机规范第2版》中第一次出现,如果两个不同加载器进行加载,那么他们就不可以进行相互访问。...更典型,如果我使用了两个加载加载了同一个,那么这两个是不一样,如果让这两个之中某一个对象另一个来进行强制类型转换,会产生异常。 5.

    94720

    javassist编程指南==Class loader 加载

    既然这两个是不同,所以一个实例就不能分配给另一个类型变量了。...注意:应用类像Point是不能访问加载如MyTranslator、ClassPool,因为它们是被不同加载加载。...应用javassist.Loader加载,而其他默认JVM加载加载。 javassist.Loader以和java.lang.ClassLoader不同顺序加载。...ClassLoader首先将加载操作委托给父加载器,如果父加载器找不到它们自身尝试加载。 反过来说,javassist.Loader在委托给父加载器之前尝试加载。...例如,上面的程序将Point在命名空间与SampleLoader命名空间分开了,因为这两个不同加载器去加载

    41700

    今天我们来聊聊JVM加载机制

    卸载: 当不再被引用或被垃圾回收器标记为已死对象时,将会被回收,但是Java虚拟机本身会始终引用加载器,而这些加载器则会始终引用它们加载Class对象,因此这些Class对象始终是可触及...两个来源于同一个 Class 文件,被同一个虚拟机加载,但是加载它们加载器不同,那这两个也不相等 那有的小伙伴就有疑惑了,还有很多加载器吗? emm..那加载顺序呢?会不会重复加载了?...这里举例几个面试会问classloader职责: Bootstrap ClassLoader:根加载器,负责加载java核心,它不是java.lang.ClassLoader子类,而是JVM...破坏双亲委派原则 当然加载双亲委派原则是可以被破坏,破坏它是由于双亲委派模型自身缺陷导致,他没有办法解决用户基础又要重新调用代码。...tomcat之所以造了一堆自己classloader,大致是出于下面三个原因: 对于各个 webapp中 class和 lib,需要相互隔离,不能出现一个应用中加载库会影响另一个应用情况,而对于许多应用

    43320

    老大难 Java ClassLoader 再不理解就老了

    AppClassLoader 可以 ClassLoader 提供静态方法 getSystemClassLoader() 得到,它就是我们所说「系统加载器」,我们用户平时编写代码通常都是加载...虚拟机策略是使用调用者 Class 对象 ClassLoader加载当前未知。何为调用者 Class 对象?...Class.forName vs ClassLoader.loadClass 这两个方法都可以用来加载目标它们之间有一个小小区别,那就是 Class.forName() 方法可以获取原生类型 Class...钻石依赖 项目管理上有一个著名概念叫着「钻石依赖」,是指软件依赖导致同一个软件包两个版本需要共存而不能冲突。 ?...(depv2Class) 我们还可以让两个不同版本 Dep 实现同一个接口,这样可以避免使用反射方式来调用 Dep 里面的方法。

    1K20

    ClassLoader 加载器模型

    当一个ClassLoader收到来自加载请求,首先把该请求委派该父ClassLoader处理,当父ClassLoader无法处理时,才当前ClassLoader来处理。...三、自定义加载器 每一个ClassLoader都拥有自己独立名称空间,ClassLoader将其加载到Java虚拟机中,故加载ClassLoader和该类本身一起确定其在Java...故只有同一个ClassLoader加载同一个,才能算是Java 运行时环境中相同两个。...哪怕是来自同一个Class文件,即使被同一个虚拟机加载两个,只要ClassLoader不同,那么也属于不同。...四、 经典应用场景 Tomcat,加载器架构,自己定义了多个加载器, 保证了同一个服务器两个Web应用程序Java库隔离; 保证了同一个服务器两个Web应用程序Java库又可以相互共享;

    43040

    深入浅出 ClassLoader

    不同类加载命名空间关系 a)同一个命名空间内相互可见。 b)子加载命名空间包含所有父加载命名空间。因此加载加载能看见父加载加载。...例如,系统加载加载能看见根加载加载。 c)加载加载不能看见子加载加载。 如果两个加载器之间没有直接或间接父子关系,那么它们各自加载相互不可见。...注意,这里说是“可见”,但能不能访问是“访问修饰符”决定。...命名空间加载器及所有父加载器所加载组成。 在不同命名空间中,有可能会出现完整名字(包括包名)相同两个。...双亲委派模型第二次“被破坏”:是这个模型自身缺陷所导致。 越基础越上层加载器进行加载,如果基础又要调用回用户代码,那该怎么办?

    81230
    领券