Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    invocare metodo costruito a runtime

    Mi chiedevo se è possibile invocare un metodo precedentemente definito prendendo il nome del metodo a runtime.

    Per esempio:

    ho due metodi A e B precedentemente definiti.

    In un terzo metodo C voglio invocare A o B a seconda del valore contenuto in un Vector<String>.

    Questo vector contiene proprio il nome del metodo (quindi A e B).

    Vorrei chiamare quindi il metodo del caso senza fare controlli del tipo

    codice:
    if(vector.firstElement().compareTo("A")
        A(bla, bla);
    else
        B(bla, bla);

    mi chiedevo se è possibile invece fare una cosa del tipo

    codice:
    vector.firstelement()(bla, bla);

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: invocare metodo costruito a runtime

    Originariamente inviato da redcloud
    Mi chiedevo se è possibile invocare un metodo precedentemente definito prendendo il nome del metodo a runtime.
    Si possono invocare metodi tramite la "reflection". Ma dovresti anche sapere di quale classe. E se devi invocare metodi di istanza, dovresti anche avere un oggetto di quella classe.

    A parte questo, dovresti spiegare bene a cosa ti serve e cosa devi fare di preciso. I vari metodi da invocare sono nella stessa classe? E se lo sono non possono certamente avere la stessa signature.

    Comunque ti chiedo di spiegare meglio, perché con la reflection è certamente possibile ma vorrei capire bene cosa devi fare e il perché. Potrebbero esserci altre strade migliori.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    codice:
    public class Pippo {
        public void a(int aa, int bb) {
            ;
        }
    
        public void b(int aa, int bb) {
            ;
        }
    
        public void c() {
            Vector<String> metodi = new Vector<String>();
            metodi.add("a");
            metodi.add("b");
    
            if(metodi.firstElement().compareTo("a") == 0)
                a(1, 2);
            else
                b(3, 4);
        }
    }
    si potrebbe sostituire il blocco if else con un'istruzione del tipo

    codice:
    metodi.firstElement()(1, 2);
    ???

  4. #4
    Puoi usare la reflection, dai uno sguardo qui per vedere un esempio di utilizzo.

    Al mio segnale... scatenate l'inferno!

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Sorry per il ritardo. Esempio completo:

    codice:
    import java.util.*;
    import java.lang.reflect.*;
    
    public class Prova
    {
        public void a (int a, int b)
        {
            System.out.println ("Sono in a");
        }
    
        public void b (int a, int b)
        {
            System.out.println ("Sono in b");
        }
    
        public static void main (String[] args)
        {
            try
            {
                ArrayList<String> lista = new ArrayList<String> ();
                lista.add ("a");
                lista.add ("b");
    
                Prova oggetto = new Prova ();
    
                for (String nome : lista)
                {
                    Class<?> c = Prova.class;
    
                    Method m = c.getMethod (nome, int.class, int.class);
    
                    m.invoke (oggetto, 123, 456);
                }
            }
            catch (Exception e)
            {
                System.out.println (e);
            }
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Grazie mille ad entrambi

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.