Я строю объектный брокер, используя Java RMI.Внешние серверы могут зарегистрироваться в нем, а после этого они также могут зарегистрировать свои сервисы.
Также есть клиентская программа, которая запрашивает выполнение зарегистрированных методов.Эти методы имеют разные имена, разные параметры, разные типы параметров и разные возвращаемые типы.Это метод, который клиенты могут выполнять:
public String ejecutar_servicio(String nom_servicio, Vector<String> parametros_servicio) throws RemoteException{
try {
for(Servidor servidor : servidores){
for(Servicio servicio : servidor.getServicios){
if(servicio.getNombre().equals(nom_servicio) && parametros_servicio.size() == servicio.numParametros()){
servidor.getNombreRegistrado() server = (servidor.getNombreRegistrado()) Naming.lookup("//" + servidor.getHostname() + "/" + servidor.getNombreRegistrado());
return server.nom_servicio(parametros_servicio);
}
}
}
return "Servicio no encontrado";
}
catch (SecurityException ex) {
return ex.toString();
}
catch (NoSuchMethodException ex) {
return ex.toString();
}
}
Очевидно, что предыдущий метод не может быть использован, как сейчас.Я хотел бы знать способ достижения этого поведения, который включает в себя объявление объектов типов, которые будут известны только во время выполнения, и приведение к типам, известным только во время выполнения.
Это класс, определенный для регистрациии сохраните список серверов:
private class Servidor{
private String hostname;
private String nombreRegistrado;
private List<Servicio> servicios = new ArrayList<>();
public Servidor(String hostname, String nombreRegistrado){
this.hostname = hostname;
this.nombreRegistrado = nombreRegistrado;
}
void registrarServicio(Servicio servicio){
servicios.add(servicio);
}
String getNombreRegistrado() {
return nombreRegistrado;
}
List<Servicio> getServicios(){
return servicios;
}
String getHostname(){
return hostname;
}
}
И это класс, определенный для их служб:
private class Servicio{
private String nombreServicio;
private Vector listaParametros;
private String tipoRetorno;
public Servicio(String nombreServicio, Vector<String> listaParametros, String tipoRetorno){
this.nombreServicio = nombreServicio;
this.listaParametros = listaParametros;
this.tipoRetorno = tipoRetorno;
}
public String getNombre(){
return this.nombreServicio;
}
public int numParametros(){
return this.listaParametros.size();
}
public String getTipoRetorno(){
return this.tipoRetorno;
}
}