【问题标题】:How to make Java load imported classes from another package?如何让 Java 从另一个包中加载导入的类?
【发布时间】:2015-09-28 21:42:33
【问题描述】:

我想动态加载一个类列表。 例如,我在目录 /hereAreMyClasses 中有: class1.class 类2.类 class3.class

使用 ClassLoader 遍历这些类并加载它们就可以了。

现在的问题是,其中一个类(比如说,class2)从另一个位置/另一个包导入了一些类。

import other.package.someClass;

public class class2 {
  //stuff
}

这在编译时工作正常,但是当我运行程序时,当我调用 someClass 时,我得到一个 NoClassDefFoundError

Class<?> clazz = clazzLoader.loadClass("class2");

如何让 ClassLoader 也加载所需的导入类?

编辑

问题解决了,多亏了我注意到的答案,我在调用我的程序时缺少类路径定义。

【问题讨论】:

  • import 语句只是用于范围界定的编译时概念。它对程序没有运行时影响。
  • import 不会做任何事情,除了节省您的输入。人们经常将其与类加载混淆。那不是它正在做的事情。

标签: java classloader packages


【解决方案1】:

在研究此解决方案之前,请尝试自行完成。内森说得对。

在编译和执行 Java 代码时,您必须将其他目录添加到类路径。一个简单的例子是这样的:

文件夹 1:

directory1/SourceCode1.java

文件夹 2:

directory2/com/dir2/SourceCode2.class

假设 SourceCode1.java 的包名为 com.dir1:

package com.dir1;

import com.dir2.SourceCode2;

public class SourceCode1 {
    public static void main(String[] args) {
        //SourceCode2 used in this class
    }
}

然后在编译和执行时你必须使用 -cp 命令告诉编译器和解释器在指定位置找到类路径。

编译时:

javac -d . -cp .:<directory2 path> SourceCode1.java

执行时:

java -cp .:<directory2 path> com.dir1.SourceCode1

【讨论】:

  • SourceCode1.java 在错误的目录下,根据它自己的包声明。
  • SourceCode1.java 不在错误目录中。编译时的目录与包名无关。这只是一个演示文件在哪里以及如何理解它们的路径和执行。
猜你喜欢
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 2016-01-27
  • 2021-06-26
  • 2020-02-24
  • 2018-10-05
  • 2013-12-22
相关资源
最近更新 更多