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

Java 类加载器并加载其位置不等于其包的类,java,classloader,dynamic-class-loaders,Java,Classloader,Dynamic Class Loaders,我希望无论何时编译的.class文件出现在某个特定目录中,都能够从已知目录加载类。但是,我希望加载.class,而不管其.java文件中的包declaration是什么。例如,我有一个我希望加载的类: package com.javaloading.test; public class SomeClassInPackage { private String name = "The name of this Class is SomeClass."; public String

我希望无论何时编译的.class文件出现在某个特定目录中,都能够从已知目录加载类。但是,我希望加载.class,而不管其.java文件中的包declaration是什么。例如,我有一个我希望加载的类:

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,则会导致错误

主线程java.lang.NoClassDefFoundError中出现异常: SomeClassInPackage错误的名称: com/javaloading/test/SomeClassInPackage


我需要能够从一个文件中加载一个类,而不管它是声明的包,也不需要知道它的包。然后,我将检查加载的类的包信息。这是使用系统类加载器或自定义类加载器实现的,还是在不了解包结构的情况下实现的?如果可能的话,任何建议都是值得赞赏的。

如果没有相应的包结构,就不可能加载该类,这意味着如果要加载该类,则必须将其放置在与其包名称对应的文件夹中,或者该类位于jar文件中,但处于相同的文件夹结构中


但是假设您希望加载外部类,这意味着不在执行该程序的类路径中,并且您希望在执行期间将其加载到当前类加载程序中。请参阅此链接。这也将回答您的下一个问题,您想在哪里加载程序根据其名称或包选择的类

如果不是从文件目录加载一个类,而是该类有一个未知的包,我想从网络套接字加载该类,这会以与上面类似的方式失败吗?我确实想知道,是否由于本文中指出的安全影响而阻止了我执行上面所要求的操作:我不认为NoClassDefFoundError是由于安全问题造成的。当您使用cl.loadClassSomeClassInPackage时。它尝试在默认包中查找该类,并假定该.class存在于类路径的根文件夹中,但未找到它。但是假设您的GetPackage是默认包,并且您将com.javaloading.test.SomeClassInPackage的.class文件放置在GetPackage类存在的根文件夹中,那么即使在这种情况下,SomeClassInPackage也不适合加载,因为它不在正确的位置。如果您确实想从任意位置加载该类,那么您可以使用java序列化。但这与类加载不同,因为您正在加载一个类及其状态,而不是像Java中的new关键字那样加载.class。