Argument type mismatch

Oi.
estou com um problema e não estou conseguindo resolver.Estou tentando passar um List como argumento, mas não esta dando certo, porem se eu mudar para String ou algo do gênero eu consigo passar o argumento tranquilamente ._.

Metodo que faz a invocação:


public static void carregaComunicação() throws InterruptedException, InvocationTargetException, NoSuchMethodException{
        
        List<Object> test = new ArrayList<Object>();
        String nome="";
        test.add(nome);
                
            caminhoArquivoComunica = new String("C:\\Users\\lucas.oliveira\\Desktop\\ServidorDinamico.jar");
            try{
                
                myJarFile = new URL("file:///"+ caminhoArquivoComunica); 
                URLClassLoader cl = URLClassLoader.newInstance(new URL[]{myJarFile});
                Jarred = cl.loadClass("principal.Servidor");
                
                simpleWriter = Jarred.getMethod("servidor", new Class[] {List.class});
                JarredObject = Jarred.newInstance();
                               
            
                Object response = simpleWriter.invoke(JarredObject, test.get(0));
                System.out.println(test.get(0));
                //JOptionPane.showMessageDialog(null, "mensagem enviada: " + suporte.getMensagemFinalComunicacao() + "\n caminho especificado" + caminhoArquivoComunica );
            }catch(IllegalAccessException ex){
                System.out.println("Acesso negado1-2: " + ex.getMessage());
            }catch(MalformedURLException e){
                System.out.println("Erro no caminho do arquivo1-4: " + e.getMessage());
            }catch(InstantiationException e){
                System.out.println("Erro ao instanciar o objeto1-5: " + e.getMessage());
            }catch(SecurityException ex){
                System.out.println("Erro no tipo do metodo1-7: " + ex.getMessage());
            }catch(ClassNotFoundException e){
                System.out.println("Erro no carregamento do pacote/classe1-8: " + e.getMessage());
            }
        }

metodo que é invocado:


            ServerSocket servidor = new ServerSocket(8080);
            JOptionPane.showMessageDialog(null, "Estou esperando uma conexão");

            
            
            conexaoCliente = servidor.accept();
            list.add(conexaoCliente);
            JOptionPane.showMessageDialog(null, "Estou conectato");
            System.out.println(conexaoCliente);
            System.out.println("O cliente" + conexaoCliente.getInetAddress().getHostAddress()+" esta conectado");  
                    
            
        }catch(IOException e){
            System.err.println("Erro na conexão: " + e.getMessage());
        }
    }

Erro gerado:
Exception in thread “main” java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at funciona.ClassLoad.carregaComunicação(ClassLoad.java:143)
at funciona.ClassLoad.main(ClassLoad.java:87)
C:\Users\lucas.oliveira\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1

Type mismatch é lançado quando um método espera laranjas e você passa cebolas…

2 curtidas

Amiguinho, você continua insistindo em não usar nomes óbvios em suas variáveis, e, provavelmente por isso, acaba se confundindo todo ao implementar seu código.

Vejamos o código que você postou:

Jarred = cl.loadClass("principal.Servidor");                           // Jarred não precisa ser variável estática
simpleWriter = Jarred.getMethod("servidor", new Class[] {List.class}); // simpleWriter não precisa ser variável estática
JarredObject = Jarred.newInstance();                                   // JarredObject não precisa ser variável estática
Object response = simpleWriter.invoke(JarredObject, test.get(0));      // invoke espera receber o mesmo tipo de parâmetro informado no getMethod

Se você usar nomes legíveis, fica mais claro de entender o que se passa.
Veja o seu código refatorado:

String nomeDaClasse = "principal.Servidor";
String nomeDoMetodo = "servidor";
Class tipoDeParametro = List.class; // tipo do parâmetro
List parametro = test;              // perceba que o objeto do parâmetro tem que coincidir com o tipo do parâmetro
Class classe = cl.loadClass(nomeDaClasse);
Method metodo = classe.getMethod(nomeDoMetodo, new Class[] {tipoDeParametro});
Object instancia = classe.newInstance();
Object retorno = metodo.invoke(instancia, parametro);
2 curtidas

@staroski, creio que ele esteja seguindo algum tutorial ou copiando o trabalho feito por outra pessoa que já tem conhecimento e não se confunde com os nomes.

2 curtidas

Desculpa :sweat_smile:

Realmente esta parte de carregar os .Jars eu peguei pronto então para min isto faz sentido…mas não peguei de um tutorial, peguei de um fórum(obs: este código estava dando erro), eu consegui entender e fiz umas modificações para atender a minha necessidade e agora estou usando.
Em relação aos nomes das variáveis eu realmente tenho que ficar mais atendo a isto, pois mesmo que este código não seja meu, eu reconheço que tenho que usar nomes melhores nas minhas variáveis
:slight_smile: