Java에서 리소스를 찾는 방법: 1. [Class.getResource()]를 통해 클래스 경로에서 리소스를 찾습니다. 2. [ClassLoader.getResource()]를 통해 패키지의 루트 디렉터리에서 리소스를 찾습니다.
【관련 학습 권장사항: java 기본 튜토리얼】
Java 리소스 찾기 방법:
1, Class.getResource()
를 통해 클래스 경로 아래에서 리소스 찾기 (bin/com/bbebfe/icons/sample.gif)Class.getResource()
定位类路径下的资源(bin/com/bbebfe/icons/sample.gif)
Class clazz = this.getClass(); URL url = clazz.getResource(imageName);
2, 通过ClassLoader.getResource()
定位包的根目录下的资源(bin/icons/sample.gif)
Class clazz = this.getClass(); URLClassLoader loader = (URLClassLoader)clazz.getClassLoader(); URL url = loader.getResource(imageName);
3, 通过ClassLoader.findResource()
提供自己定制的方式定位资源
URL url = loader.findResource(imageName);
那么这三种方法有那些区别, 我们应该在何时使用哪种方法呢?
1、Class.getResource()
方法
该方法实际通过该Class的Class Loader的getResource()方法来获得资源, 在调用ClassLoader的getResource()方法之前, Class.getResource()方法会对资源名称做一定的处理,构建一个该资源的绝对名称absolute name, 大意是:
+ 如果资源名称以'/'('/u002f') 开始, 则资源的绝对名称是'/'以后的部分.
如果imageName是"/icons/sample.gif", 则在这里会变成"icons/sample.gif"
+ 否则对于其他情况, 绝对名称将是如下形式(给资源名称的前面加上modified_package_name/):
modified_package_name/resource_name
(修正的包名称/资源名称)
其中修正的包名称含义是将当前对象所在的包名称中的'.'('/u002e')替换为'/'
如果ClassLoader.getResource()方法返回一个值为null的URL, 则Class.getResource()方法最终会将资源请求交给ClassLoader.getSystemResource(java.lang.String)
.
2、ClassLoader.getResource()
方法
该对资源进行查找, 资源的名称是以'/'分隔的路径, 这个方法首先查找自己的父亲ClassLoader, 由自己的父ClassLoader来查找资源(实际上, 如果父亲的父亲不是空, 则父亲仍会向上提交查找请求). 如果自己的父ClassLoader是null, 则查找Java虚拟机中内建的class loader, 并将资源请求提交给它们, 如果这些操作都失败了, 则ClassLoader会调用自己的findResource()方法来查找资源.
3、ClassLoader.findResource()
rrreee
ClassLoader.getResource()
를 통해 패키지의 루트 디렉터리에서 리소스를 찾습니다(bin/icons/sample.gif) rrreee
3.ClassLoader.findResource()
rrreee그러면 이 세 가지 방법의 차이점은 무엇이며 언제 어떤 방법을 사용해야 할까요?🎜🎜1.
Class.getResource()
메소드🎜🎜 이 메소드는 실제로 ClassLoader의 getResource() 메소드를 호출하기 전에, Class.getResource () 메소드는 리소스 이름에 대한 특정 처리를 수행하고 리소스의 절대 이름을 구성합니다. 이는 대략 다음과 같습니다. 🎜🎜 + 리소스 이름이 '/'('/u002f')로 시작하는 경우, 그러면 리소스의 절대 이름은 ' /'입니다. 다음 부분은 🎜🎜 using use with out out out out out out in ‐ ‐ ‐‐‐‐ 이름 앞에는 수정된_패키지_이름이 추가됩니다. /): 🎜🎜 Modified_package_name/Resource_name
🎜🎜 수정된 패키지의 패키지 이름 의미는 '('/u002e')가 '/'🎜🎜로 대체됩니다. () 메서드가 null 값이 있는 URL을 반환하면 Class.getResource() 메서드는 결국 리소스 요청을 ClassLoader.getSystemResource(java.lang.String)
에 넘겨줍니다.🎜🎜2. code>ClassLoader.getResource() 메소드🎜🎜는 리소스를 검색해야 합니다. 리소스 이름은 '/'로 구분된 경로입니다. 이 메소드는 먼저 자체 상위 ClassLoader를 검색한 다음 자체 상위 ClassLoader를 사용합니다. 리소스를 찾기 위해(실제로 부모의 부모가 비어 있지 않으면 아버지는 계속 검색 요청을 위쪽으로 제출합니다.) 자신의 부모 ClassLoader가 null이면 Java 가상 머신 내장 클래스 로더에서 검색하고 리소스 요청을 제출합니다. 이러한 작업이 실패하면 ClassLoader는 자체 findResource() 메서드를 호출하여 리소스를 찾습니다. 🎜🎜3. ClassLoader.findResource()
메서드 🎜🎜이 메서드는 내부적으로 지정된 리소스를 검색합니다. 자신만의 클래스 로더를 구현하려면 이 방법을 재정의하여 자신만의 특정 방식으로 클래스 파일과 리소스를 찾아야 합니다. 🎜🎜🎜관련 학습 권장 사항: 🎜프로그래밍 동영상 🎜🎜🎜위 내용은 Java에서 리소스를 찾는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!