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

类加载器java。lang.NoClassDefFoundError?

钱峻
2023-03-14

因此,我有一个类加载器加载一个类,如下所示:

ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass("modules.Test");
Method method = cls.getDeclaredMethod("getModule", noparams);
Class<?> type = method.getReturnType();

if(type.newInstance() instanceof Module){
    System.out.println("Accessed field with type: Module");
}

模块在运行时位于另一个jar中。以及测试。类是在主jar中生成的,然后我取消了它的归档,所以依赖项就在那里。

如何从外部访问其他依赖项。我加载的类文件?

例外情况:

java.lang.NoClassDefFoundError: com/xxxxxxx/xxxx/objects/Module
Caused by: java.lang.ClassNotFoundException: com.xxxxxxx.xxxx.objects.Module

共有1个答案

越麒
2023-03-14

我认为问题的出现是因为你的模块。Test类依赖于模块类,但您的自定义类装入器找不到该类。

我认为这是因为您错误地实例化了自定义类加载器。你写道:

ClassLoader cl = new URLClassLoader(urls);

这将创建一个类加载器,其父类加载器是默认的系统类加载器。但是这个错误意味着默认的类加载器不是了解模块的类加载器。试试这个:

Classloader cl = new URLClassLoader(
        urls, this.getClass().getClassLoader());

这至少应该给你一个知道Modules的类加载器。

注意:将包含Modules的JAR的URL添加到urls数组是非解决方案。您最终可能会加载Modules类两次,这可能会导致其他问题。(例如,instanceof不起作用。)

 类似资料:
  • 如果我有一个内部类声明,例如: 其次是: A$B内部类也会加载吗?如果B内部类没有被声明为“静态”呢?

  • 简介 Java类加载器是Java运行时环境(Java Runtime Environment)的一部分,负责动态加载Java类到Java虚拟机的内存空间中。类通常是按需加载,即第一次使用该类时才加载。 由于有了类加载器,Java运行时系统不需要知道文件与文件系统。每个Java类必须由某个类加载器装入到内存。 类装载器子系统涉及Java虚拟机的其他几个组成部分,以及几个来自java.lang库的类。

  • 问题内容: 我们知道我们可以使用以下方法覆盖System 类加载器: 那么,既然它本身是一个类,它是由谁加载的? 我们如何获得该“元”类加载器的类文件? 问题答案: 从Javadoc中获取: 如果在首次调用此方法时定义了系统属性“ java.system.class.loader”,则该属性的值将作为要作为系统类加载器返回的类的名称。 该类使用默认的系统类加载器加载, 并且必须定义一个公共构造函数

  • 一、类加载机制 1.定义: 把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。 在Java语言里,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会为Java应用程序提供高度的灵活性,Java里天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点来实现的。

  • 本文向大家介绍java 类加载与自定义类加载器详解,包括了java 类加载与自定义类加载器详解的使用技巧和注意事项,需要的朋友参考一下 类加载 所有类加载器,都是ClassLoader的子类。 类加载器永远以.class运行的目录为准。 读取classpath根目录下的文件有以下几种方式: 1 在Java项目中可以通过以下方式获取classspath下的文件: 在Tomcat中tomcat又声明了

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