CLASS_PATH에 포함되어 있지 않은 클래스를 로딩해서 객체를 생성할 일이 생겼다. CLASS_PATH가 잡혀 있다면 간단하게 Class.forName() 등을 사용하면 되겠지만 해당 클래스가 필요할 때만 jar 파일 등으로 묶여서 제공된다. 게다가 jar 파일의 이름을 알지 못 하니 CLASS_PATH에 넣을 수도 없다. 이런 경우에 간편하게 사용할 수 있는 ClassLoader가 있었다. 이름은 URLClassLoader..
이 클래스는 파일(일반 파일), jar 파일, http, ftp 등으로 접근할 수 있는 클래스를 동적으로 로딩할 수 있게 해 준다. jar 파일에 포함된 클래스를 로딩하는 간단한 예제는 아래와 같다.
Hello 클래스와 HowAreYou 클래스는 미리 컴파일해서 Hello.jar 파일로 생성해 둔다.
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 언로딩 완료
- 켄트 벡의 구현 패턴
이 클래스는 파일(일반 파일), 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());
}
}
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!!";
}
}
public class Hello
{
public String toString()
{
return "Hello!!";
}
}
package test;
public class HowAreYou
{
public String toString()
{
"How are you??";
}
}
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 언로딩 완료
- 켄트 벡의 구현 패턴






덧글
2009/06/11 08:58 # 삭제 답글
비공개 덧글입니다.
Sigel 2009/06/11 12:36 #
잘 쓰세요~~ 저도 요기 조기서 얻어온 정보를 조합해 놓은거지만 ㅋㅋ