0

我在这个上浪费了太多时间。为什么此代码无法生成类的 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();
    }
}
4

3 回答 3

0

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

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();
    }
}
于 2013-09-04T09:25:13.697 回答
0

它将起作用,并将通过以下一次更正打印 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_pa​​ckage_name/name

其中 modified_pa​​ckage_name 是此对象的包名称,其中 '/' 替换为 '.' ('\u002e')。

于 2013-09-04T09:36:08.267 回答
0

代码只需要提供类名:

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

来自 Java 文档:

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

于 2013-09-04T09:22:54.433 回答