2010-10-01 20 views
4

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

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

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

редактировать: то, что я получаю наиболее застрял на это дан произвольный объект 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

объекты на вашем клиенте являются прокси: они называются окурки. Чтобы получить интерфейсы из него вы должны кодировать что-то вроде этого, где 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.

+0

.... и ваш объект «c» имеет «больше» объектов класса, которые являются вашими интерфейсами. –

+0

ah, метод getClass(). GetInterfaces() был тем, чего мне не хватало. Как-то я думал, что вам нужно getInterfaces() без получения объекта класса. –

+0

Вам не нужно, чтобы сервер реализовал это. Клиент может запустить точно такой же код на своем заглушке и получить тот же ответ. – EJP