Lưu ý quan trọng: nếu vượt qua bằng cách tham khảo phương tiện thay đổi giá trị tham số bên trong phương pháp và thay đổi biến ban đầu trong người gọi, bạn không thể. Nếu những gì bạn muốn làm là chuyển một bản sao của một tham chiếu đến một đối tượng, để cho phép phương thức tương tác với một số đối tượng của bạn ... có bạn có thể. Câu trả lời khám phá tùy chọn thứ hai đó.
Có. Nhưng nó phải là một đối tượng RMI. Trong trường hợp đó, một bản RMI sẽ được chuyển qua bản sao.
RMI qua đối số và trả lại giá trị theo hai cách: (! Nó có được từ xa nếu nó là một tài liệu tham khảo)
- sao chép toàn bộ đối tượng
- gửi một xa tham khảo.
mẫu
Guess chúng tôi có một dịch vụ. Đó là một đối tượng RMI, được xuất bản thông qua đăng ký RMI, vì vậy nó có thể truy cập được với các máy khách. Khách hàng có thể gọi một phương thức trên nó (để tạo ra một cái gì đó) và dịch vụ muốn trả về một tham chiếu đến đối tượng mới được tạo ra đó. Không phải là một bản sao được tuần tự hóa mà là một tham chiếu tới đối tượng được tạo trong không gian bộ nhớ máy chủ.
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();
}
Trong ví dụ này, bạn có thể:
Tạo một thực hiện MyService và xuất bản nó
Registry registry = LocateRegistry.createRegistry(port);
MyService stub = (MyService) UnicastRemoteObject.exportObject(server, 0);
registry.bind("myService", stub);`
và sau đó, một số khách hàng RMI có thể nhận được một tham chiếu đến nó
Registry registry = LocateRegistry.getRegistry(server, port);
MyService serv1 = (MyService) registry.lookup("myService");
và có tham chiếu đến đối tượng dịch vụ có thể lấy tham chiếu đến đối tượng RMI khác.
MyHandle handle1 = serv1.createX(...);
handle1.doOne()
Trong ví dụ này đối số phương pháp được đăng (nó phải là một lớp Serializable) trong khi đối tượng quay trở lại là một tham chiếu đến một đối tượng RMI được tạo trong máy chủ.
Việc triển khai createX (...) Có thể là:
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
}
cảm ơn :) nhưng tôi không nhận được câu trả lời của bạn: ( bạn có thể cung cấp ví dụ không? :) – MBZ
Chắc chắn ... Tôi chưa có ví dụ nào tại thời điểm đó ... – helios
@MBZ Nó dường như với tôi rằng anh ta đã đưa cho bạn một ví dụ, nhưng đây chỉ là một ví dụ khác của một tham chiếu được truyền theo giá trị. Nó không đi qua tham chiếu chút nào. Thay đổi giá trị của tham chiếu trong callee không thay đổi giá trị đó trong người gọi. Downvote. – EJP