간단한 대답은 구현이 Sun의 내부 작동의 일부이며 공용 수단을 통해 사용할 수 없다는 것입니다. getURLs()
은 전달 된 URL 만 반환합니다. 대답은 더 길지만 대담한 것입니다.
디버거를 사용하여 Oracle JVM 8을 실행하면 OpenJDK6과 거의 동일한 구조로 안내되고 클래스 경로 here이로드되는 위치를 확인할 수 있습니다.
기본적으로 클래스 로더는 아직 구문 분석하지 않은 URL 스택을 메모리에 보관합니다. 클래스를로드하라는 요청을 받으면 스택에서 URL을 팝핑하여 클래스 파일 또는 jar 파일로로드하고 jar 파일 인 경우 매니페스트를 읽고 클래스 경로 항목을 스택에 푸시합니다. 파일을 처리 할 때마다 해당 파일을 로더 맵에로드 한 "로더"를 추가합니다 (다른 파일이없는 경우 동일한 파일을 여러 번 처리하지 못하도록합니다).
당신이 (그것을 권하고 싶지 않다) 할 정말 동기 경우이지도에 액세스 할 수 있습니다
: external.jar을 참조 I 더미-plugin.jar이 더미 설정에 그 실행
Field secretField = URLClassLoader.class.getDeclaredField("ucp");
secretField.setAccessible(true);
Object ucp = secretField.get(loader);
secretField = ucp.getClass().getDeclaredField("lmap");
secretField.setAccessible(true);
return secretField.get(ucp);
(더미-plugin.jar의 매니페스트에) 나는 다음 얻을 :
1) 즉시 클래스 로더를 만든 후 (모든 클래스) 넣기 전에 : 후
urlClassLoader.getURLs()=[file:.../dummy-plugin.jar]
getSecretUrlsStack=[file:.../dummy-plugin.jar]
getSecretLmapField={}
2) 더미-plugin.jar에서 클래스를로드 :
urlClassLoader.getURLs()=[file:.../dummy-plugin.jar]
getSecretUrlsStack=[file:.../external.jar]
getSecretLmapField={file:.../[email protected]}
3) external.jar에서 클래스를로드 한 후 :
urlClassLoader.getURLs()=[file:.../dummy-plugin.jar]
getSecretUrlsStack=[]
getSecretLmapField={file:.../[email protected], file:.../[email protected]}
이상하게도이이 JDK for URLClassLoader의 얼굴에 비행 보인다
로드되는 클래스는 기본적으로 URLClassLoader를 만들 때 지정된 URL에 에 액세스 할 수있는 권한 만 부여됩니다.시스템 클래스 로더 인스턴스의 private 필드에 액세스하는 반사를 사용
병을 열고 무슨 일이 벌어지고 있는지 확인하기 위해 생성 된 매니페스트를 볼 수 있습니까? – gandaliter
매니페스트에는 libs 디렉토리의 모든 jar를 나열하는 클래스 경로 항목이 있습니다. - 예상대로. – michas