2013-09-04 1 views
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(); 
    } 
} 
+0

처음에는 클래스를 찾기 위해 사용 된 기본 클래스 로더를 사용하고 있고 클래스를로드하는 데 동일한 클래스 로더를 다시 사용하고있는 것 같습니다. 어느 것도 발견되지 않을 것이다. –

답변

0

다음과 같이 하나의 수정으로 작동하고 URL이 인쇄됩니다.

*. resourceName 문자열에 접두사 "/"를 붙입니다. 이름은 '/'('\의 u002f')로 시작하면

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

OR

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

이유는 자원의 절대 이름이다

(JavaDoc의부터)이다 '/'뒤에 오는 이름의 일부. 그렇지 않으면 절대 이름의 형식은 다음과 같습니다. modified_package_name/name

여기서 modified_package_name은 '/'대신 '/'가 사용 된이 객체의 패키지 이름입니다. ('\ u002e').

0
코드는 클래스 이름을 제공해야

: 자바 문서에서

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

: 클래스의 바이너리 명을 지정하면

를, 클래스 로더는 시도해야 은 클래스의 정의를 구성하는 데이터를 찾거나 생성합니다. 일반적인 전략은 이름을 파일 이름으로 변환 한 다음 파일 시스템에서 해당 이름의 "클래스 파일"을 읽는 것입니다.

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(); 
    } 
} 
관련 문제