当前位置: 首页 > 知识库问答 >
问题:

从另一个类加载器用接口加载类

郭思聪
2023-03-14

我有一个类foo,它实现了idomagic接口。foo类由system classloader加载,idomagic接口在第三方组件中定义,我认为第三方组件将接口加载到另一个类加载器(动态类加载器)中。

当我试图创建foo的新实例时,我得到的是idomagicnoClassDeffound。我想这是因为它是由不同的类加载器加载的。

我尝试创建BridgeClassLoader(与Guice使用的类似),然后从system类加载器加载类Foo,并从另一个类加载器加载所有其他类,我认为这是用于IDomagic的类加载器,但没有成功。

有办法绕过它吗?

共有1个答案

尹辰沛
2023-03-14

Java中的Classloaders(CL)采用委托策略,这意味着CL首先询问其父级,其父级也询问其父级是否知道类X的定义。只有当父级、任何祖先级或当前的classloader都不知道X的类定义时,当前的classloader才会从各自的X.class文件中加载定义。

如果一个类foo由system classloader加载,则任何foo依赖的类也需要由system CL或该CL的父级加载。由于IDomagic是在其他JAR中提供的,因此您很可能需要将此JAR文件添加到类路径(java-cp...java-jar...)。由于委托模型,任何作为该CL(grand-;以此类推)子级的CL也将获得对任何父级CL加载的类定义的访问权。

如果idomagic需要由自定义CL加载,则foo必须不由系统CL加载,而是使用自定义CL或该CL的子级加载,以便在加载/实例化foo时,委派策略能够发挥作用并提供idomagic的定义。

有一个自定义委托CL模型,其中共享类保存在一种公共CL列表/数组中,可以由依赖CL使用。依赖类不是公共CLs的直接子级,而是委托CL的子级,委托CL只是在询问父级是否两个子级都不能执行任务之前,将调用委托给公共CLs。这里的一个解决方案可能是这样的结构:

bootstrap CL
- system CL
  - delegation CL
    - common CL
    - plugin CL
      - plugin 1 CL
      - plugin 2 CL

这里,委托CL需要将loadclass(...)findclass(...)的调用委托给它所包含的公共CL(对象组合),只有当它找不到定义时,才将调用委托给它的父级。类似于这个静止的实验班

这个委托加载器允许用公共CL F.E加载IDomagic。和foo类,其中一个插件加载器不是公共CL的直接子级。但是,这要求委托CL在询问父级CL之前,首先将所有调用传播到公共CL。此外,这个委托加载器给表带来了一些开销,因为它使自定义CL的一个缺点(卸载未使用的类)变得更加困难。

 类似资料:
  • 我正在我的web应用程序中集成一个web服务。web服务为我提供了一个。dll和。jar文件。我把.dd放在/jre/bin中,把.jar放在/jre/lib中,然后开发代码并部署应用程序。在开发过程中,我还将。jar文件包含在我的项目构建路径中。在tomcat中运行它时,它给了我一个错误:

  • 问题内容: 我已经部署了一个Web应用程序,其中包含以下代码。 现在,我部署了另一个具有相同代码的Web应用程序。尝试加载库时,将引发以下错误。 我想同时运行这两个应用程序。 直到现在我已经尝试了: 在一个应用程序中加载库,并将上述异常捕获到另一个应用程序中 从两个应用程序中删除了jar,并将opencv.jar放入Tomcat的类路径(即/ usr / share / tomcat7 / lib

  • 我有两个java web应用程序,需要使用Windows集成身份验证连接到SQL Server数据库。 加载的第一个可以正常工作,但第二个会引发异常: 当我放置sqljdbc\u auth时,就会出现上述错误。其中一个文件夹中的dll: C:\WINDOWS\system 32\ C:\Program Files\Apache Software Foundation\Tomcat 7.0\bin\

  • 如果认为Tomcat的公共类加载器正在加载这个类,实例化它(按照:http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html),然后将引用传递给webapp,从而绕过webapp类加载器,这是不是错的? 是否有一种方法可以告诉Tomcat实例化我的单例(强制公共类加载程序执行),然后提供该实例来满足我的WebApp的依赖性? 任何

  • 框架中所有的类都是通过类加载器(ClassLoader)加载的,通过Loader我们可以实现类的统一管理。下面我们一起来看看Loader提供了哪些加载方法: 1. Loader::import 加载一个类或者加载一个包 方法原型 import( $classPath, $type = IMPORT_APP, $extension=EXT_PHP ) 参数名称 参数说明 $classPath 文件的

  • 加载器,顾名思义,是用于加载元素的,加载的元素可以是库(类),视图文件 , 驱动器 ,辅助函数 , 模型 或其他你自己的文件。 注解 该类由系统自动加载,你无需手工加载。 应用程序"包" 包的视图文件 类参考 应用程序"包" 应用程序包(Package)可以很便捷的将你的应用部署在一个独立的目录中, 以实现自己整套的类库,模型,辅助函数,配置,文件和语言包。 建议将这些应用程序包放置在 appli