ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Class.getResource vs. ClassLoader.getResource
    Computer/Programming 2009. 5. 12. 00:38
    Java API Documentation에서 보면 

    먼저 Class에 있는 getResource를 보자. Class는 일단 instance가 있어야 부를 수가 있다.  

    public URL getResource(String name)

    Finds a resource with a given name. The rules for searching resources associated with a given class are implemented by the defining class loader of the class. This method delegates to this object's class loader. If this object was loaded by the bootstrap class loader, the method delegates to ClassLoader.getSystemResource(java.lang.String).

    Before delegation, an absolute resource name is constructed from the given resource name using this algorithm:

    • If the name begins with a '/' ('\u002f'), then the absolute name of the resource is the portion of the name following the '/'.
    • Otherwise, the absolute name is of the following form:
         modified_package_name/name
       

      Where the modified_package_name is the package name of this object with '/' substituted for '.' ('\u002e').

    설명을 살펴보면 ClassLoader에 있는 getSystemResource 메소드를 사용하는데 
    resource를 나타내는 String이 '/'로 시작하면 absolute path로 하고
    그렇지 않으면 this object가 포함되어 있는 package의 full path라고 한다. 

    다음으로 ClassLoader를 살펴 보면 
    public URL getResource(String name)
    Finds the resource with the given name. A resource is some data (images, audio, text, etc) that can be accessed by class code in a way that is independent of the location of the code.

    The name of a resource is a '/'-separated path name that identifies the resource.

    This method will first search the parent class loader for the resource; if the parent is null the path of the class loader built-in to the virtual machine is searched. That failing, this method will invoke findResource(String) to find the resource.

    absolute path를 사용하게 된다. 

    따라서 일반적으로는 ClassLoader보다는 Class의 getResource를 사용하는 편이 낫다고들 한다. 
    ClassLoader의 Security Permission 제약도 문제가 될 수 있다 하는 사람도 있다. 
    getResourceAsStream도 같은 원칙으로 적용될 수 있다. 

    보통 코드를 쓸 때 instance로부터 읽을 때는
    this.class.getResource("def/g.xml");
    this.getClass().getResource("/abc/def/g.xml") ;
    라고 쓰면 된다. 

    Class로부터 읽고 싶을 때도 있어서
    MyClass.class.getRosource("a.xml");
    이런 식으로 쓰면 될 것이다. 

Designed by Tistory.