RMI + Java отражение - PullRequest
       15

RMI + Java отражение

4 голосов
/ 01 октября 2010

Я использую RMI, чтобы разрешить доступ к моему Java-приложению через MATLAB, который работает в другой JVM.MATLAB имеет приятный интерфейс для печати методов Java-объекта.Но с RMI это не удается, потому что объект, который он получает, является прокси.

Поэтому я хотел бы добавить свой собственный метод для извлечения / печати возможности удаленного интерфейса (RMI, очевидно,прямой доступ к методам, недоступным в экспортированных удаленных интерфейсах).

Как я могу сделать это с отражением, либо на стороне клиента соединения RMI, либо на стороне сервера?У меня нет большого опыта использования отражения.Пример использования ниже.

edit: что я больше всего застрял на при произвольном объекте X (включая где X - прокси RMI), как я могу использовать отражениеполучить интерфейсы, реализованные этим объектом?

Java-классы:

/** client-side remote describer */
class RemoteDescriber
{
    RemoteDescription describe(Remote remote) { ... }
}

/* representation of remote interfaces implemented by an object */
class RemoteDescription implements Serializable
{
    /* string representation of remote interfaces implemented by an object */
    @Override public String toString() { ... }

    /* maybe there are other methods permitting object-model-style navigation
     * of a remote interface
     */
}

interface FooRemote extends Remote
{
    /* some sample methods */
    public int getValue() throws RemoteException;
    public void setValue(int x) throws RemoteException;
    public void doSomethingSpecial() throws RemoteException;
    /* other methods omitted */        

    /** server-side */
    public RemoteDescription describe() throws RemoteException;        
}

и пример сеанса клиента в MATLAB

x = ...;     % get something that implements FooRemote
describer = com.example.RemoteDescriber;
% describer is a client-side Java object

description1 = describer.describe(x)

%%% prints a description of the FooRemote interface 
%%% obtained by the client-side RemoteDescriber

description2 = x.describe()

%%% prints a description of the FooRemote interface 
%%% obtained on the server-side by x itself, and marshalled
%%% to the client

1 Ответ

1 голос
/ 01 октября 2010

Объекты на вашем клиенте являются прокси: они называются заглушками. Чтобы получить от него интерфейсы, вы должны написать что-то вроде этого, где o ваш объект:

Class c = o.getClass();
Class[] theInterfaces = c.getInterfaces();
for (int i = 0; i < theInterfaces.length; i++) {
   String interfaceName = theInterfaces[i].getName();
   System.out.println(interfaceName);
}

Заглушки генерируются автоматически: поэтому вам не следует внедрять что-то в них, но вы можете реализовать метод getInformation() в своих удаленных интерфейсах; каждый объект сервера должен реализовывать это и возвращать строку, которая содержит всю информацию об объекте сервера. Этот метод генерирует строку путем получения информации посредством отражения от объекта this.

...