Приведение из строковой переменной Java - PullRequest
1 голос
/ 04 мая 2019

У меня есть этот метод для внешних клиентов для выполнения методов с использованием RMI. Мне не удалось преобразовать переменную Naming в тип, определенный в String, возвращаемом servidor.getNombreRegistrado(). Я создаю брокера, в котором серверы могут регистрировать себя и свои сервисы в брокере, чтобы сделать их доступными для клиентов. Вот почему мне нужно привести результат из Naming.lookup к типу, на котором зарегистрирован сервер. Таким образом я смогу вызывать его методы с использованием 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()){
                    try{
                        Object server = (Object) Naming.lookup("//" + servidor.getHostname() + "/" + servidor.getNombreRegistrado());
                        server = (servidor.getNombreRegistrado()) server;
                        server.dar_fecha();
                        return "";
                    }catch(Exception ex){
                        System.out.println(ex);
                        return "Excepcion";
                    }
                }
            }
        }
        return "Servicio no encontrado";
    }
    catch (SecurityException ex) {
        return ex.toString();
    }
}

Как я могу добиться такого поведения?

Это класс Servidor:

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;
    }
}

Это класс Servicio:

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;
    }
}

1 Ответ

0 голосов
/ 04 мая 2019

Здесь:

server = (servidor.getNombreRegistrado())

Это просто невозможно в Java.Приведение - это прежде всего операция во время компиляции.Вы говорите компилятору, что знаете, что какой-то объект имеет определенный тип.Значение: ваша идея динамически приводить объект к результату вызова некоторого метода во время выполнения, что не имеет никакого смысла.

Этот метод возвращает строку, последовательность символов.Строка - это просто строка.Вы не можете превратить строку во что-то еще.Аналогично: строка «Ferrari» может обозначать известный спортивный автомобиль, но это все же просто строка.Вы не можете сидеть в «Феррари» и уезжать.Потому что это струна, а не машина!(или объект класса, который моделирует автомобили)

Я думаю, что реальный ответ для вас - сделать шаг назад.Здесь вы пытаетесь делать сложные вещи, но вам не хватает базовых знаний о Java.Кажется, вы перегружаете себя.Сделайте шаг назад и изучите базовую Java на несколько дней.Затем вернитесь и вернитесь к rmi.

...