2015-09-26 127 views
0

我想加载一个动态类的列表。 例如我在目录/ hereAreMyClasses: class1.class class2.class class3.class如何让Java从另一个包中加载导入的类?

遍历这些类有一个ClassLoader,并加载它们工作得很好。

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

import other.package.someClass; 

public class class2 { 
    //stuff 
} 

能正常工作的编译时间,但是当我运行该程序,我得到了SomeClass的一个NoClassDefFoundError的时候我打电话

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

我如何得到的ClassLoader还加载所需的进口类?

编辑

问题解决了,感谢我注意到了,叫我的程序时,我缺少的类路径清晰的答案。

+0

的'import'说法只是针对范围界定编译时间的概念。它对程序没有运行时间影响。 –

+0

导入不会执行任何操作,除非保存输入。人们经常将它与类加载混淆。这不是它在做什么。 – duffymo

回答

-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 
+0

根据它自己的package语句,'SourceCode1.java'在错误的目录中。 – EJP

+0

SourceCode1.java不在错误的目录中。编译时的目录与包名无关。这只是演示文件的位置以及如何理解它们的路径和执行。 – Vishal