나는 차이가 사이 궁금해 Class.getResource()
하고 ClassLoader.getResource()
?
편집 : 특히 캐싱이 파일 / 디렉토리 레벨에 관련되어 있는지 알고 싶습니다. "클래스 버전으로 디렉토리 목록이 캐시됩니까?"에서와 같이
AFAIK 다음은 본질적으로 동일해야하지만 그렇지는 않습니다.
getClass().getResource()
getClass().getClassLoader().getResource()
WEB-INF/classes/
해당 디렉토리의 기존 파일에서 새 파일을 작성하는 일부 보고서 생성 코드를 사용하여이를 발견했습니다 . Class의 메서드를 사용할 때을 사용하여 배포 getClass().getResource()
할 때 있던 파일을 찾을 수 있지만 새로 만든 파일을 가져 오려고 할 때 null 객체 를 받았습니다 . 디렉토리를 찾아 보면 새 파일이 있다는 것을 명확하게 보여줍니다. 파일 이름 앞에는 "/myFile.txt"와 같이 슬래시가 붙습니다.
반면 ClassLoader
버전은 getResource()
생성 된 파일을 찾았습니다. 이 경험을 통해 어떤 종류의 디렉토리 목록을 캐싱하는 것 같습니다. 맞습니까? 그렇다면 어디에 기록되어 있습니까?
로부터 API 문서 에Class.getResource()
지정된 이름의 리소스를 찾습니다. 주어진 클래스와 연관된 자원을 검색하기위한 규칙은 클래스의 정의 클래스 로더에 의해 구현됩니다. 이 메소드는이 객체의 클래스 로더에 위임합니다. 부트 스트랩 클래스 로더가이 객체를로드 한 경우, 메소드는 ClassLoader.getSystemResource (java.lang.String)에 위임됩니다.
나에게 이것은 "Class.getResource가 실제로 자신의 classloader의 getResource ()를 호출하고있다"고 읽습니다. 어느 것과 같은 것 getClass().getClassLoader().getResource()
입니다. 그러나 분명히 그렇지 않습니다. 누군가이 문제에 대해 조명을 제공해 주시겠습니까?