我正在使用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;
}
}