加载类作为资源失败

时间:2013-09-04 09:16:24

标签: java classpath

我浪费了很多时间在这个上面。为什么这段代码无法导致该类的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();
    }
}

3 个答案:

答案 0 :(得分:0)

代码只需要提供类名:

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

来自Java Doc:

  

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

答案 1 :(得分: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();
    }
}

答案 2 :(得分:0)

它将起作用,并将通过一次更正打印URL,如下所示。

*。在资源名称字符串前加上“/”。

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

OR

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

原因是(来自JavaDoc)

如果名称以'/'('\ u002f')开头,则资源的绝对名称是'/'后面的名称部分。 否则,绝对名称具有以下形式:    modified_pa​​ckage_name /名称

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