将类作为资源加载失败



我在这个问题上浪费了太多时间。为什么此代码无法将URL导出到类?

package org.test;
import java.net.URL;
public class Testa {
    public Testa() {
        String resourceName =  "org/test/Testa.class";
        String clazz = "org.test.Testa";
        try {
            Class.forName(clazz);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        URL url = this.getClass().getResource(resourceName);
        System.out.println("Why is this null? >>> " + url);
    }
    public static void main(String[] args) {
        new Testa();
    }
}

它将正常工作,并将通过如下更正打印URL。

*。资源名称字符串的前缀为"/"。

String resourceName =  "/org/test/Testa.class";

*. String resourceName =  "Testa.class";//No need to mention full path - resources work with relative path

原因是(来自JavaDoc)

如果名称以"/"("\u002f")开头,则资源的绝对名称是名称中"/"后面的部分。否则,绝对名称的形式如下:modified_package_name/name

其中,modified_package_name是此对象的包名称,用"/"替换为"('\u002e')。

代码只需要提供类名:

URL url = this.getClass().getResource("Testa.class");

从Java文档:

给定类的二进制名称,类加载器应该尝试定位或生成构成类定义的数据。A.典型的策略是将名称转换为文件名,然后从文件系统中读取该名称的"类文件"。

资源的路径是相对于class路径的。

package org.test;
import java.net.URL;
public class Testa {
    public Testa() {
        String resourceName =  "Testa.class"; // /org/test/Testa.class would be looking for /org/test/org/test/Testa.class
        String clazz = "org.test.Testa";
        URL url = this.getClass().getResource(resourceName);
    }
    public static void main(String[] args) {
        new Testa();
    }
}

最新更新