programing

Class.getResource()와 ClassLoader.getResource()의 차이점은 무엇입니까?

prostudy 2022. 8. 31. 21:42
반응형

Class.getResource()와 ClassLoader.getResource()의 차이점은 무엇입니까?

Class.getResource() ★★★★★★★★★★★★★★★★★」ClassLoader.getResource()

편집: 특히 파일/디렉토리 수준에서 캐싱이 관련되어 있는지 알고 싶습니다."디렉토리 목록이 클래스 버전에서 캐시되었습니까?"와 같습니다.

AFIK는 기본적으로 다음과 같은 작업을 수행해야 하지만 그렇지 않습니다.

getClass().getResource() 
getClass().getClassLoader().getResource()

을 알게 된 것은 새로운 .WEB-INF/classes/해당 디렉토리의 기존 파일에서 가져옵니다.시 있었던 파일을 를 사용하여 수 .getClass().getResource()새로 만든 파일을 가져오려고 할 때 늘 개체를 받았습니다.디렉토리를 참조하면, 새로운 파일이 거기에 있는 것이 명확하게 표시됩니다."/myFile.txt" 입니다.

ClassLoadergetResource()편,, 생생생파 파다다다다다다이 경험으로 보아 디렉토리 리스트의 캐싱이 진행되고 있는 것 같습니다.제이말 습습? 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다.

API 문서에서Class.getResource()

지정된 이름의 리소스를 찾습니다.특정 클래스와 관련된 리소스 검색 규칙은 클래스의 정의 클래스 로더에 의해 구현됩니다.이 메서드는 이 개체의 클래스 로더에 위임됩니다.이 오브젝트가 부트스트랩클래스 로더에 의해 로드된 경우 메서드는 ClassLoader에 위임됩니다.getSystemResource(java.lang).문자열).

Class.getResource는 getResource()를 사용합니다.고고읽읽읽읽다다은 '아까부터'를 하는 것과 .getClass().getClassLoader().getResource()하지만 그것은 분명히 아니다.누가 이 문제에 대한 설명을 좀 해주시겠어요?

Class.getResource는 클래스 패키지에 대해 상대적으로 처리되는 "유효한" 리소스 이름을 사용할 수 있습니다.또는 선행 슬래시를 사용하여 "절대" 리소스 이름을 지정할 수 있습니다.클래스로더 리소스 경로는 항상 절대 경로로 간주됩니다.

따라서 기본적으로 다음과 같습니다.

foo.bar.Baz.class.getResource("xyz.txt");
foo.bar.Baz.class.getClassLoader().getResource("foo/bar/xyz.txt");

또한 다음과 같습니다(단, 위와 다릅니다).

foo.bar.Baz.class.getResource("/data/xyz.txt");
foo.bar.Baz.class.getClassLoader().getResource("data/xyz.txt");

번째 은 " " 를 합니다..classroot.classpath를 합니다.

이러한 문제를 디버깅하려면 다음 URL을 인쇄합니다.

System.out.println( getClass().getResource(getClass().getSimpleName() + ".class") );

사양에서 찾아야 했습니다.

클래스의 getResource() - 설명서에 차이가 기재되어 있습니다.

이 메서드는 리소스 이름을 변경한 후 클래스 로더에 콜을 위임합니다.리소스 이름이 "/"로 시작하는 경우 변경되지 않습니다.그렇지 않은 경우 패키지 이름은 "."에서 "/"로 변환된 후 리소스 이름 앞에 추가됩니다.이 오브젝트가 부트스트랩로더에 의해 로드된 경우 콜은 ClassLoader에 위임됩니다.getSystemResource.

질문에 대한 답변뿐만 아니라 이 질문에 대한 답변도 모두 "/foo/bar.properties"와 같은 절대 URL을 로드하는 것이 다음 사용자로부터 동일하게 처리되었음을 나타냅니다.class.getResourceAsStream(String) ★★★★★★★★★★★★★★★★★」class.getClassLoader().getResourceAsStream(String)Tomcat (7.0.40) 입니다.

MyClass.class.getResourceAsStream("/foo/bar.properties"); // works!  
MyClass.class.getClassLoader().getResourceAsStream("/foo/bar.properties"); // does NOT work!

미안, 전혀 납득할 만한 설명은 없지만, 저 톰캣이 불량한 속임수와 블랙 마술을 클래스 로더에게 부려먹어 차이를 일으키는 것 같아.는 항상 ★★★★★★★★★★★★★★★★★★★★★★★★.class.getResourceAsStream(String)지금까지 아무 문제가 없었습니다.

추신: 여기에도 올렸습니다.

캐시가 진행 중인지 아닌지에 대한 질문에 답합니다.

getResourceAsStream ClassLoader 메서드를 사용하여 디스크에서 파일을 지속적으로 로드하는 스탠드아론 Java 응용 프로그램을 실행하여 이 점을 더 조사했습니다.파일을 편집할 수 있었고 변경 사항이 즉시 반영되었습니다. 즉, 파일이 캐시 없이 디스크에서 다시 로드되었습니다.

단,저는 여러 개의 maven module과 서로 의존하는 웹 프로젝트를 진행하고 있습니다.웹 프로젝트를 컴파일하고 실행하기 위해 인텔리J를 IDE로 사용하고 있습니다.

위의 내용은 더 이상 해당되지 않는 것 같습니다.왜냐하면 로드하고 있던 파일이 현재 항아리에 삽입되어 웹 프로젝트에 도입되어 있기 때문입니다.대상 폴더의 파일을 변경하려고 했지만 소용이 없었습니다.이것에 의해, 캐시가 행해지고 있는 것처럼 보이게 되었습니다.

Class.getResources는 오브젝트를 로드하는 클래스 로더에 의해 리소스를 가져옵니다.한편, 「 」는, 「 」, 「 」의 사이에ClassLoader.getResource는 지정된 클래스 로더를 사용하여 리소스를 가져옵니다.

Java 9가 있기 때문에ClassLoader#getResource모듈 패스 상에서 동작하고 있는 경우.이것 때문에, 나는 절대 그것을 사용하지 않을 것이다.ClassLoader#getResource새로운 암호로.

코드가 명명된 모듈에 있고,ClassLoader#getResource리소스가 같은 모듈에 있어도 코드가 리소스 취득에 실패할 수 있습니다.이것은 매우 놀라운 행동이다.

했고, 이에 매우 놀랐다.Class#getResource ★★★★★★★★★★★★★★★★★」ClassLoader#getResource javadoc"에 완전히

또한 리소스의 이름이 ".class"로 끝나는 특별한 경우를 제외하고 이 메서드는 패키지를 무조건 열었을 때(이 메서드의 호출자가 리소스와 동일한 모듈에 있더라도) 이름 있는 모듈의 패키지만 검색합니다.

자바독(강조 지뢰)

input1에서 읽어보려고 했습니다.txt는 내 패키지 중 하나와 그것을 읽으려는 학급에 들어 있었다.

다음과 같은 기능이 있습니다.

String fileName = FileTransferClient.class.getResource("input1.txt").getPath();

System.out.println(fileName);

BufferedReader bufferedTextIn = new BufferedReader(new FileReader(fileName));

은 '우리에게 전화하는 것' 요.getPath()올바른 경로 이름을 String 형식으로 지정할 경우.fileName을 완전히 망칠 수 있는 추가 서식 텍스트가 추가되므로 사용하지 마십시오(사용해 보고 인쇄물을 볼 수 있습니다).

2시간 동안 디버깅을 했는데...:(

또 다른 효율적인 방법은 @Value를 사용하는 것입니다.

@Value("classpath:sss.json")
private Resource resource;

그런 다음 이 방법으로 파일을 얻을 수 있습니다.

File file = resource.getFile();

언급URL : https://stackoverflow.com/questions/6608795/what-is-the-difference-between-class-getresource-and-classloader-getresource

반응형