2012-06-25 5 views

답변

5

중요 사항 :있어서 내부 인수 값을 수정하는 수단은 호출 원의 변수를 변경 기준 통과 경우 없습니다. 원하는 작업이 객체에 대한 참조 인 을 전달하면 메소드가 사용자의 일부 객체와 상호 작용할 수 있습니다. 예. 할 수 있습니다. 대답은 두 번째 옵션을 탐구합니다.

예. 그러나 RMI 객체 여야합니다. 그 경우, RMI 스텁은 카피에 의해 건네받습니다.

RMI는 인수를 전달하고 반환은 두 가지 방법으로 값 : (! 그것의 경우 참조 원격이어야한다)

  1. 전체 개체
  2. 를 복사합니다 원격 참조를 보낼 수 있습니다.

샘플

맞춰 우리는 서비스가있다. 이것은 RMI 레지스트리를 통해 발행 된 RMI 객체이므로 클라이언트가 액세스 할 수 있습니다. 클라이언트는 메소드를 호출하여 (무언가를 작성하기 위해) 서비스가 새로 작성된 해당 오브젝트에 대한 참조를 리턴하려고합니다. 직렬화 된 복사본이 아니라 서버 메모리 공간에 생성 된 객체에 대한 참조입니다.

이이면 MyService의 구현을 만들고

Registry registry = LocateRegistry.createRegistry(port); 
MyService stub = (MyService) UnicastRemoteObject.exportObject(server, 0); 
registry.bind("myService", stub);` 

다음은 일부 RMI 클라이언트가

에 대한 참조를 얻을 수 게시 : 당신이 할 수이 예에서

import java.rmi.Remote; 
import java.rmi.RemoteException; 

// normally published object 
public interface MyService extends Remote 
{ 
    // creates something and return a "handle" to it 
    public MyHandle createX(SomeSerializableObj param1) throws RemoteException; 
} 

// interface for object that the service will return a reference to... 
public interface MyHandle extends Remote 
{ 
    void doOne(); 
    void doTwo(); 
} 

Registry registry = LocateRegistry.getRegistry(server, port); 
MyService serv1 = (MyService) registry.lookup("myService"); 

이며 서비스 개체에 대한 참조를 사용하면 다른 RMI 개체에 대한 참조를 얻을 수 있습니다. 리턴 된 객체는 서버에 생성 된 객체에 참조 RMI 동안

MyHandle handle1 = serv1.createX(...); 
handle1.doOne() 

메소드 인수 직렬화이 예에서 (는 직렬화 클래스이어야한다).

createX (...)가 될 수있다 : 당신의 참조의

public MyHandle createX(...) { 
    MyHandle handle = new MyHandleImpl(); // create an implementation 
    createdHandlers.add(handle); // add it to some structure (just a sample) 
    return handle; // return the implementation. RMI will send to client a RMI reference to this very instance 
} 
+0

감사합니다 :)하지만 답변을 얻지 못했습니다. ( 예를 들어주세요. :) – MBZ

+0

물론 ... 그 순간에 예를 들어 보지 못했습니다 ... – helios

+1

@MBZ It 그가 이미 당신에게 모범을 보이고있는 것처럼 보이지만 이것은 가치로 전달 된 참조의 또 다른 예일뿐입니다. 그것은 참고로 통과하지 않습니다. 호출 수신자에서 호출 수신자의 참조 값을 변경해도 호출 값은 변경되지 않습니다. Downvote. – EJP

3

:

(1) RMI 참조로 패스를 지원하지 않습니다 말한다. 나는 동의한다.

(2)은 RMI가 in-out 매개 변수를 지원하지 않는다고 말합니다. 나는 동의한다.

(3)은 참조로 전달하고 값으로 전달 참조 사이의 일반적인 혼란을 보여줍니다. RMI는 나머지 Java와 마찬가지로 후자를 수행합니다.

(4)입니다.

(5)는 단순한 일관성이 없습니다. RMI에는 참조에 의한 전달이 없습니다.

RMI의 원격 '값 별 참조'는 추가로 가능한 오류 모드를 제외하고 Java의 로컬 '값 별 참조'과 본질적으로 다른 의미가 없습니다.

당신이 읽은 내용의 의미가 아닌 원격 참조를 위해, RMI 오브젝트 인수 및 결과보다는 참조 값에 의한 방법을 전달 자바의 인수로 값, 객체 직렬화를 통해에 의해 전달되는 것입니다.

0

진정한 의미에서 '아니오'는 의미가 없습니다.

"참조"로 뭔가를 전달할 때 실제로하고있는 일은 포인터를 메모리의 위치로 전달하는 것입니다. 호출자와 호출 수신자가 동일한 프로세스 일 때 완벽하게 작동합니다. 똑같은 힙에 액세스 할 수 있습니다. 그러나 컴퓨터 A에서 컴퓨터 B로 메모리 참조를 전달하는 것은 의미가 없으며 A는 B 메모리 *에 액세스 할 수 없습니다.

그러나 RMI를 사용하면 원격 객체에 대한 "참조"를 얻을 수 있지만 상당히 동일하지 않으며 미리 요청해야합니다. 객체 중 하나를 서버에 전달하면 사본이 생성됩니다. 말의 입 (http://www.oracle.com/technetwork/java/javase/tech/index-jsp-138781.html#3)에서

스트레이트

RMI는 표준 자바 객체를 사용하여 개체를 전달하는 직렬화 메커니즘 원격 객체에 대한 참조 인 인수는 원격 참조로 전달됩니다. 메소드에 대한 인수가 기본 유형이거나 로컬 (비 원격) 객체 인 경우 전체 복사본이 서버로 전달됩니다. 반환 값은 같은 방식으로 처리되지만 다른 방향으로 처리됩니다. RMI를 사용하면 로컬 객체에 대한 전체 객체 그래프와 원격 객체에 대한 참조를 전달하고 반환 할 수 있습니다.

원격 개체를 참조로 전달할 수 있지만 참조로 서버에 로컬 개체를 다시 전달할 수는 없습니다.

기술적으로는 일부 대규모 분산 공유 메모리 시스템에서 사용할 수 있지만 OP가 말하는 것만 큼 의심 스럽습니다.

관련 문제