2009-03-31 4 views
1

어떻게 동적 프록시 스텁 구현이 실제로 장면 뒤에서 수행되는지 이해하고 싶습니다. 필자가 읽은 바에 따르면 미리 생성 된 스텁 클래스가없는 경우 원격 객체를 내보낼 때까지 RMI 런타임은 스텁으로 작동하는 동적 프록시를 생성합니다. 그 스텁은 RMI 레지스트리에 바인드되어 나중에 일부 RMI 클라이언트가 액세스 할 수 있습니다.RMI의 동적 프록시 스텁 구현

질문 : 실제로 스텁이 동적으로 생성 된 프록시이기 때문에 클래스 정의를 클라이언트 측에서 사용할 수 없으므로 클라이언트가 RMI 레지스트리에서 스텁을 검색 할 수있는 방법은 무엇입니까? 어떤 종류의 동적 클래스 로딩이 장면 뒤에서 일어나고 있습니까? 아니면 RMI가이 문제를 해결하기 위해 다른 기술을 사용합니까?

답변

2

Java.lang.reflect.Proxy는 직렬화 가능하며 ObjectOutputStream 및 ObjectInputStream을 특수하게 지원합니다. 기본적으로 구현 된 인터페이스와 호출 핸들러는 직렬화되며 비 직렬화 중에는 새로운 동적 프록시가 생성됩니다.

+0

좋은 답변입니다. 놀랄 만한. 고마워, EJP. –

-2

RMI는 동적 클래스로드를 사용합니다. 클래스 경로는 클라이언트가 클래스를로드하는 '클래스 경로 주석'으로서 호출과 함께 전송됩니다. 자세한 정보는 RMI 구현을 보면 알 수 있습니다. JDK 소스의 일부로 사용할 수 있습니다. 특히, 클래스 ObjectOutputStream 및 RMIClassloader.

업데이트 : RMI가 HTTP 서버를 시작하지 않습니다. 실제로이 경우 사용자 지정 솔루션이 필요합니다. 언급 한 것 중 하나는 실행하는 HTTP 서버가 될 수 있고, 서버를 통해 클래스를 사용할 수있게 만들고, 클라이언트가 다운로드 할 수 있도록 스텁에 HTTP 서버의 주소/포트와 함께 코드베이스를 전달할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 나는 동적 클래스 로딩이 클래스 정의 요청을 제공하기 위해 HTTP 서버와 같은 장소를 필요로하기 때문에 이것이 실제로 어떻게 행해지는지 여전히 의문이다. RMI가 동적 프록시 클래스를 호스트하기 위해 내부적으로 서버를 시작하지 않는 한. 어떤 생각? –

+0

답변을 업데이트했습니다. – talonx

+0

이것은 꽤 부정확합니다. 소스 JVM에 지정된 * codebase * 속성은 RMI MarshalOutputStream에 의해 마샬링되는 동안 직렬화 된 * 객체 *와 함께 전달됩니다. 여기에는 이미 스텁이 아닌 모든 마샬링 된 객체에 HTTP 서버의 host : port가 포함되어 있습니다. – EJP