【问题标题】:Loading a custom class from arbitrary location从任意位置加载自定义类
【发布时间】:2012-12-21 22:52:36
【问题描述】:

我在 Java 中的类加载方面遇到了一些问题。在我的项目中,我试图从任何地方动态加载一个类。但是,我目前无法加载硬编码的文件,并且经过 6 小时的谷歌搜索和堆栈溢出检查后仍然一无所知。

我怀疑我正在加载的类的包名有问题。 我的目标是在 project/resources/dynamicFolderNonInClassPath/loadThis 目录中加载类 LoadAClass.java。由于我将我的 URLClassLoader 设置为上面的文件夹,因此它的包已设置为

package loadThis;

public class LoadAClass{
static{
System.out.println("I am loaded");
}

(...)
}

但是我不断收到未找到类的异常。

File file = new File("C:/Users/Robert/Documents/workspace/project/resources/dynamicFolderNonInClassPath/");
if (!file.exists()) System.out.println("typo!"); //debug print
URL url = file.toURI().toURL();
URLClassLoader loader = new URLClassLoader(new URL[]{url});
String classToBeLoaded = "loadThis.LoadAClass";

Class classy = loader.loadClass(classToBeLoaded);
System.out.println(classy.getCanonicalName()); //debug print

我尝试了不同的组合,例如直接将 URLClassLoader 设置为文件或将完整的 /resources/dynamicFolderNonInClassPath/loadThis 作为 URL,但到目前为止没有成功。

有圣诞气氛的人发现问题了吗?我对这个功能似乎有一些误解,我希望看到它得到修复。

【问题讨论】:

    标签: java dynamic classloader urlclassloader classnotfound


    【解决方案1】:

    您缺少正斜杠“/”

    File file = new File("C:/Users/Robert/Documents/workspace/project/resources/dynamicFolderNonInClassPath");
    if (!file.exists()) System.out.println("typo!"); //debug print
    URL url = new URL("C:/Users/Robert/Documents/workspace/project/resources/dynamicFolderNonInClassPath/");
    URLClassLoader loader = new URLClassLoader(new URL[]{url});
    String classToBeLoaded = "loadThis.LoadAClass";
    
    Class classy = loader.loadClass(classToBeLoaded);
    System.out.println(classy.getCanonicalName()); //debug print
    

    见第三行

    【讨论】:

    • 您确定文件 dynamicFolderNonInClassPath/loadThis/LoadAClass.class 存在吗?
    • 也打印出 loader.getUrls()
    • 编辑:正如预期的那样,for循环只产生一行:“file:/C:/Users/Robert/Documents/workspace/project/resources/dynamicFolderNonInClassPath/”
    • 试试URL url = new URL("C:/Users/Robert/Documents/workspace/project/resources/dynamicFolderNonInClassPath/"); URLClassLoader loader = new URLClassLoader(new URL[]{url});
    • 只是为了仔细检查。也可以在代码中试试这个,File file = new File("C:/Users/Robert/Documents/workspace/project/resources/dynamicFolderNonInClassPath/loadThis/LoadAClass.class"); if (!file.exists()) System.out.println("typo!"); //debug print
    【解决方案2】:

    .java 文件不是类文件。你编译过吗?您需要在“loadThis”目录中创建一个 LoadAClass.class 文件,并且您的类加载器指向包含“loadThis”的目录。

    【讨论】:

    • URL 类加载器应该能够加载“.java”文件吗?据我所知,它会编译此类文件。
    • 不,ClassLoader 就像它的名字所说的那样。它加载类。它不是编译器。
    • 它是一个类加载器,它加载 .class 文件 :-)
    • 我很难相信这一点。你可能只是编译到你的源目录中。
    猜你喜欢
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 2015-02-15
    • 1970-01-01
    相关资源
    最近更新 更多