类加载器并加载其位置不等于其包的类

时间:2013-12-02 22:51:40

标签: java classloader dynamic-class-loaders

每当编译的.class文件出现在该特定目录中时,我希望能够从已知目录加载一个类。但是,我希望加载.class,无论package文件中的.java decleration是什么。例如,我有这个类,我希望加载:

package com.javaloading.test;

public class SomeClassInPackage {
    private String name = "The name of this Class is SomeClass.";
    public String getName(){
            return name;
    }

}

它位于包com.javaloading.test中。然后我想用这个类加载它:

public class GetPackage {

    public static void main(String[] args){
            new GetPackage().loadMyClass();
    }

    public void loadMyClass(){
            // Get the current class loader
            ClassLoader cl = getClass().getClassLoader();
            try {
                    Object o = cl.loadClass("SomeClassInPackage");
                    System.out.println("Class loaded!");
            } catch (ClassNotFoundException ex){
                    System.out.println("Could not load class");
            }
    }
}

如果我将上述两个类的.class个文件放在同一目录中并运行GetPackage,则会导致错误

  

线程“main”中的异常java.lang.NoClassDefFoundError:   SomeClassInPackage(错误的名称:   COM / javaloading /测试/ SomeClassInPackage

我需要能够加载一个类(来自文件),无论它是否已声明包,并且无需实际知道它的包。然后我会检查加载的类的包信息。这可能是使用System ClassLoader或自定义ClassLoader,还是在不了解包结构的情况下是不可能的?如果可能有任何建议值得赞赏。

1 个答案:

答案 0 :(得分:0)

如果没有相应的包结构,则无法加载类,这意味着如果要加载类,则必须将其放在与其包名对应的文件夹中,或者该类位于jar文件中但在同一个文件夹中文件夹结构。

但是,假设您要加载外部的类,这些类不在执行此程序的类路径中,并且您希望在执行期间将其加载到当前类加载器中。请参阅此链接How to load the classes at runtime。这也将为您的下一个问题提供答案,您希望加载程序根据其名称或包选择的类。