2012-07-16 4 views
4

저는 JVM과 ClassLoader를 처음 접했습니다. 나는이 두 클래스가 : 프로그램 시작시Java에서 클래스 로더 이해하기

public abstract class CoreModule extends Entity 

public final class EventManager extends CoreModule 

을, 나는 EventManager의 인스턴스를 만듭니다. 그래서 나는 EventManager이 grand-child이기 때문에 Entity 클래스가 무엇인지 알 수 있고 그것을로드하는 방법 (즉, ClassLoader이 무엇인지를 안다)을 JVM이 알고 있다는 것을 이해한다. 그러나 Entity 인스턴스가 일부 직렬화 메커니즘에 의해 전달되면 ClassNotFoundException이 발생합니다. 수동으로 ClassLoader (Event.class.getClassLoader())을 사용하도록 설정해야합니다.

Event 클래스가 무엇인지 JVM에서 알 수 없는데 어떻게 그것을로드 했습니까?

+0

인프라에 대한 자세한 정보를 제공 할 수 있습니까? – kosa

+0

죄송하지만 "인프라"가 무슨 뜻인지 모르겠습니다. 적절한 JVM은 Dalvik입니다. – m0skit0

+0

웹 응용 프로그램 또는 데스크톱 응용 프로그램입니까? 어떤 프레임 워크를 사용하고 있습니까? 직렬화 등을 위해 특별한 클래스를 사용하고 있습니까? – kosa

답변

2

사실 JVM은 이것을 "마법처럼"파악하지 못합니다. 이것은 모두 사용하는 환경에 따라 달라질 시스템 클래스 로더를 기반으로합니다. 다음에, 각 thread에는 문맥 ClassLoader가있어 거기로부터 자동적으로 파생합니다. 당신의 직렬화 코드는 당신이 당신이 한이 방법을 설정해야 컨텍스트 클래스 로더에서 볼 수없는 클래스를 해석 할 수 있어야합니다 경우 Thread.setContextClassLoader

를 사용하여 변경할 수 있습니다

컨텍스트 클래스 로더.

+0

고맙습니다. 이제 디 직렬화가 완료되면 시스템 스레드가이를 처리하므로 내 클래스에 대해 알 수 없습니다. – m0skit0

1

EventManager의 인스턴스를 만듦으로써 JVM에로드하는 방법을 표시하지 않았습니다. 실제로 JVM과 대화하는 것은 아닙니다. 하나의 특정 클래스 로더와 이야기하고 있고, 같은 클래스 로더가 비 직렬화시에 담당하지 않으면 오류가 발생할 수 있습니다. 그래서 문제는 clasloader가 어떤 시점에서 담당하고 있는지에 관한 것입니다.

+0

답변 주셔서 감사합니다. 이제 클래스 로딩 메커니즘이 훨씬 향상되었습니다. – m0skit0