네트워크를 통해 JVM의 여러 인스턴스간에 동적으로 생성 된 유형 (Kryo와 직렬화 된 이진 표현)을 전달해야하는 기능을 구현 중입니다. 어떤 타입이 로딩되고 어떤 타입이 아닌지를 제대로 해결하기 위해서 다른 동적으로 생성 된 클래스 로더에 의해 부모로 사용되는 (Java -Djava.system.class.loader
파라미터로 전달 된) 커스텀 시스템 클래스 로더를 사용합니다. 이 커스텀 시스템 클래스 로더는 그 자식을 알고 클래스를 찾을 수없는 경우, 파생 된 클래스 로더에게 클래스 로더의 표준 계층 구조와는 반대 인 것을 묻습니다.모든 클래스에서 사용자 정의 시스템 클래스 로더를 사용하지 않습니다.
이러한 동적 생성 유형은 다른 JVM간에 완벽하게 잘 전송되고로드됩니다. 문제는 동적으로 생성 된 형식 중 하나를 참조하는 일부 형식 (해당 클래스가 디스크에서로드되고 모든 JMV에 대해 동일 함)의 인스턴스를 deserialise하려고 할 때 발생합니다. ClassNotFoundException은 Kryo의 인스턴스에 의해 발생합니다. readClass
동적으로 생성 된 유형의 이름으로.
방법 readClass
내부가 차례로 지정된 사용자 정의 클래스 로더를 사용 (즉, 모든 동적으로 생성 된 종류 알고) 대신 sun.misc.Launcher $ AppClassLoader 인스턴스를 사용하지 않는 Class.forName
를 호출.
설명 된 문제를 피하기 위해 모든 클래스가로드되도록 사용자 정의 시스템 전체 클래스 로더를 지정할 수 있습니까?
업데이트
추가 분석 ClassLoader.getSystemClassLoader()
실제로 지정된 사용자의 시스템 클래스 로더를 반환하는 것으로 나타났다. 다행스럽게도 Kryo 라이브러리는 비 직렬화시 클래스를로드하기위한 사용자 정의 클래스 로더 설정을 지원합니다. 이 두 사실은 설명 된 문제에 대한 해결책의 기초를 형성했습니다.
물론 ... JVM이 java.system.class.loader 자체를로드하기 위해로드되는 최소 필수 클래스를 분석 한 다음 나머지를 모두로드 할 것을 기대했습니다. 고맙습니다. – 01es
최소한의 클래스 집합은 변경하지 않으므로 다시로드 할 필요가 없다고 가정합니다. –
다시로드 할 필요는 없지만 인스턴스가 동적으로로드되는 다형성 호환 유형의 인스턴스를 참조하기 시작할 수 있으며 결과적으로 직렬화/비 직렬화 프로세스 중에로드 된 기본 클래스를 사용하여 찾을 수 없습니다. 클래스 로딩, 네이티브 계측 에이전트 및 커스텀 AppClassLoader 구현에 관한 구체적인 참고 자료가 있습니까? JVM 사양? 고맙습니다. – 01es