Я использую 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
.... и ваш объект «c» имеет «больше» объектов класса, которые являются вашими интерфейсами. –
ah, метод getClass(). GetInterfaces() был тем, чего мне не хватало. Как-то я думал, что вам нужно getInterfaces() без получения объекта класса. –
Вам не нужно, чтобы сервер реализовал это. Клиент может запустить точно такой же код на своем заглушке и получить тот же ответ. – EJP