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

跨类装入器类装入

佘茂才
2023-03-14

我有一个CustomClassLoader,它从映射加载类

Exception in thread "main" java.lang.NoClassDefFoundError: external/class/in/urlclassloader/ClassImportedByLoadedClass
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:642)
    at CustomClassLoader.defineClass(EncryptedByteArrayClassLoader.java:35)

我需要某种方法来:

a)加载URLClassLoader中的所有类

b) 有办法将URLClassLoader设置为从内存加载的类的默认类加载器(而不是我的CustomClassLoader)

第35行:

public Class<?> defineClass(String name, byte[] bytes) {
    return super.defineClass(name, bytes, 0, bytes.length);
}

我尝试设置上下文ClassLoader如下:

Thread.currentThread().setContextClassLoader(jarLoader);

其中jarLoader是URLClassLoader

有没有办法完成我想做的事情?


共有1个答案

丰辰沛
2023-03-14

您应该重写CustomClassLoader中的ClassLoader(ClassLoader父项)构造函数,并将URLClassLoader传递到以下位置:

class CustomClassLoader extends ClassLoader {
     public CustomClassLoader(URLClassLoader parent, ...your data...) {
         super(parent);
         ...
     }
}

CustomClassLoader customClassLoader = new CustomClassLoader(jarLoader, ...);
 类似资料:
  • 最近我开始学习类加载器在Java中是如何工作的。以下是我注意到的三点: 点-1:每个类加载器都有一个父类加载器。当类加载器被要求加载类或资源时,它会在尝试加载项本身之前咨询其父类加载器。父级反过来咨询其父级,依此类推。因此,只有当所有祖先类加载器都找不到项时,当前类加载器才会参与其中。 Point-2:同一个类由两个加载器加载,被视为两个不同的类实体。我们甚至不能将一个类(加载器1)对象转换为另一

  • 装载,顾名思义,是用来装载元素。这些元素可以是库 (类) 视图文件, 辅助函数, 模型, 或者是你自己的文件。 提示: 这个类是由系统初始化的,所以,没有必要自己手动初始化。 以下为这个类里面的函数: $this->load->library('class_name', $config, 'object name') 这个函数是用来加载核心类。class_name 是你要加载的类的名称。 提示:

  • 我曾经读到过Java中类装入器的委托模型的“唯一性”特性: https://www.baeldung.com/java-classloaders#uniqueness 我不明白,如果没有这样的模型,我们怎么会有加载非唯一类的风险呢? 当类装入器使用完全限定的类名来装入它们时,我们如何才能最终装入重复的类,特别是当我们在将任务委托给父装入器之前检查一个类是否已经装入时? https://www.ba

  • 问题内容: 这是我的问题和我的项目结构 我有一个要使用的类型 但是,当我尝试将其添加到导入中时,这些问题会出现: 虽然我在函数声明中使用了它 这是什么问题? 我试图用导入 问题答案: 您不能“ 从 包中导入”。您所能做的就是“导入 整个 程序包”。这意味着,如果您和该程序包在开始时就声明自己被称为foo ,则该程序包中的所有内容都必须由以下字符限定: 如果调用了包,则声明变量将使整个包变色:因此,

  • 本文向大家介绍Java Float包装器类,包括了Java Float包装器类的使用技巧和注意事项,需要的朋友参考一下 Float是提供的包装类,用于包装float基本值。 让我们创建一个带有float原语的Float对象。 现在让我们从字符串创建一个Float对象。 下面的示例显示了上面讨论的两种输出方法。 示例 输出结果