Google AdSense (text)

hidden logo stop

Moving

거지 같은 이글루스 광고노출 정책이 싫어서,
새 보금자리(http://blog.leocat.kr/)로 이사감.

[Java] URLClassLoader을 이용한 동적 클래스 로딩 Computer & Program

CLASS_PATH에 포함되어 있지 않은 클래스를 로딩해서 객체를 생성할 일이 생겼다. CLASS_PATH가 잡혀 있다면 간단하게 Class.forName() 등을 사용하면 되겠지만 해당 클래스가 필요할 때만 jar 파일 등으로 묶여서 제공된다. 게다가 jar 파일의 이름을 알지 못 하니 CLASS_PATH에 넣을 수도 없다. 이런 경우에 간편하게 사용할 수 있는 ClassLoader가 있었다. 이름은 URLClassLoader..

이 클래스는 파일(일반 파일), jar 파일, http, ftp 등으로 접근할 수 있는 클래스를 동적으로 로딩할 수 있게 해 준다. jar 파일에 포함된 클래스를 로딩하는 간단한 예제는 아래와 같다.


package test;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;

public class Test
{
    public static void main(String [] args) throws Exception
    {
        String jarFilePath = "Hello.jar";
        File jarFile = new File(jarFilePath);

        URL classURL = new URL("jar:" + jarFile.toURI().toURL() + "!/");
//      new URL("http", "www.hostname.com", "/lib/hello.jar")
//      new URL("ftp", "user:password@www.hostname.com:", "/")
        URLClassLoader classLoader = new URLClassLoader(new URL [] {classURL});

        Class clazz1 = classLoader.loadClass("test.Hello");
        Object obj1 = clazz1.newInstance();
        System.out.println(obj1.toString());

        Class clazz2 = classLoader.loadClass("test.HowAreYou");
        Object obj2 = clazz2.newInstance();
        System.out.println(obj2.toString());
    }
}

Hello 클래스와 HowAreYou 클래스는 미리 컴파일해서 Hello.jar 파일로 생성해 둔다.

package test;

public class Hello
{
    public String toString()
    {
        return "Hello!!";
    }
}

package test;

public class HowAreYou
{
    public String toString()
    {
        "How are you??";
    }
}


Test 클래스에서는 Hello 클래스와 HowAreYou 클래스를 동적으로 로딩하여 toString() 메소드를 호출한다. URLClassLoader 생성자의 전달인자로 URL 배열이 주어진 것을 볼 수 있다. 이를 통해 동시에 여러 URL을 추가할 수 있다. 또한 addURL() 메소드를 통해서 나중에 또 추가할 수 있다.


하지만!! URLClassLoader는 아주 치명적인 약점이 있다. =ㅅ=;; URLClassLoader 객체가 GC되기 전까지는 한 번 로딩된 jar 파일을 삭제할 수 없다. 끈질긴 놈.. 한 번 물면 안 놓는다. 때문에 막 삽질을 하며 구글링을 했는데 얼마 전에 훈련소 가 있는 동안 도착한 "썬 개발자 뉴스레터(SDN)" 메일에 아주 제대로된 제목의 포스트가 있었다!! 이름하여 "URLClassLoader 닫기" 오오~~ 이게 왠 횡제란 말인가 하며 포스트를 확인한 순간!! (털썩!!) JDK 7 빌드48에 추가되는 기능이란다. @ㅅ@ 확실히 JDK 7에는 close()라는 메소드를 지원해서 한번 물은 파일을 놓을 수 있게 해놓았다.

그래서 또 시작한 구글링.. 이번엔 똑같은 문제로 고민하다 jar 파일을 언로딩하는 코드를 만들어 놓은 포스트를 발견했다. 난 정말 땡큐를 부르며 사용해 보니 잘 된다. TㅅT 캄솨합니다. 나도 이제jar 파일을 지울 수 있게 되었어요~~ TㅅT


+ 관련 정보
- URLClassLoader
- URLClassLoader 닫기
- 클래스로더 2, 자바2의 기본 클래스로더
- 크라켄 JAR 언로딩 완료
- 켄트 벡의 구현 패턴

핑백

  • Sigel's house made of ice 。。。 : [Java] InputStream 조심해서 쓰자 TㅅT 2009-07-07 21:54:54 #

    ... jar 파일 안에 있는 클래스 파일을 동적으로 로딩해서 사용하고 jar 파일을 지워야 했다. 아주 간단하게는 JarClassLoader를 사용하면 되지만, 이 클래스를 사용하면 jar 파일을 한 번 물고 놓아주지 않아 jar 파일의 삭제가 불가능하다. 그래서 해결책을 찾고 물어물어 좋은 방 ... more

덧글

  • 2009/06/11 08:58 # 삭제 답글 비공개

    비공개 덧글입니다.
  • Sigel 2009/06/11 12:36 #

    잘 쓰세요~~ 저도 요기 조기서 얻어온 정보를 조합해 놓은거지만 ㅋㅋ
댓글 입력 영역

Google AdSense (text/image)