Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di joker06
    Registrato dal
    Dec 2006
    Messaggi
    782

    getMethod, come utilizzarlo correttamente?

    Ciao,

    sto cercando di passare il nome di un metodo tramite stringa.
    Cercando su internet ho trovato che molti usano la reflection sicche hoprovato con quella.

    Il menu richiama un listener che legge il nome del menu e richiama un metodo con lo stesso nome.
    quindi per esempio se ho l'item del menu

    codice:
     JMenuItem jmiAbout = new JMenuItem("aboutPanel");
    vorrei far richiamare il metodo aboutPanel() .

    io ho fatto:
    codice:
     Method getPanel = Interface.class.getMethod(c);
    dove c è la stringa che contiene il nome del metodo che vorrei ricchiamare ed arriva correttamente.
    Se faccio un print ho come risposta

    Public method found: public void Interface.aboutPanel()

    facendo un secondo test con un method non definito mi risponde correttamente

    Method either doesn't exist or is not public

    Il mio problema è: come faccio ad utilizzare ora questo metodo? Non riesco a farglielo chiamare/utilizzare.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da joker06 Visualizza il messaggio
    Il mio problema è: come faccio ad utilizzare ora questo metodo? Non riesco a farglielo chiamare/utilizzare.
    Method ha: Object invoke(Object obj, Object... args)

    Il punto è che devi sapere tu se il metodo è di istanza o di classe. Se di istanza devi passare l'oggetto in 'obj' su cui il metodo sarà invocato. Altrimenti se di classe, in 'obj' passi null. Il resto sono ovviamente i parametri. I tipi primitivi vanno, per forza di cose, passati tramite i rispettivi wrapper. Se la firma del metodo fosse xyz(int), va passato un Integer (e chiaramente puoi anche sfruttare l'autoboxing di Java 5, se passi variabili o costanti primitive), ci pensa la reflection alla conversione a int.
    Ultima modifica di andbin; 06-10-2014 a 16:52
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di joker06
    Registrato dal
    Dec 2006
    Messaggi
    782
    un ti seguo ma non ti seguo xD

    semplifico la cosa:

    la mia classe:
    codice:
    public class Interface extends JFrame implements ActionListener{
    Qua ricevo la stringa
    codice:
    	public void panel(String c){
           
            try{
                Method getPanel = Interface.class.getMethod(c);
                System.out.println("Public method found: " + getPanel.toString());
            }
            catch (NoSuchMethodException ex){
                System.out.println("Method either doesn't exist " + "or is not public: " + ex.toString());
            }
    	}
    e questo è il metodo che devo richiamare a parte tutti i commenti xD:
    codice:
    public static void aboutPanel(){
            String x = "about panel";
    		//System.out.println(contain);
    		//t.setBackground(Color.RED);
    		JLabel select = new JLabel(x);
    		//t.add(select = new JLabel(x));
    		//t.add(select);
    		//cardLayout.show(Con, "aboutPanel");
    
    
    		//window.validate();
    	}
    ho provato a fare delle ricerche basandomi su quanto avevi scritto te però non ho trovato o forse non ho capito quello che trovavo

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da joker06 Visualizza il messaggio
    e questo è il metodo che devo richiamare a parte tutti i commenti xD:
    codice:
    public static void aboutPanel(){
    Vedo che il metodo è statico ("di classe"), quindi il primo argomento di invoke può essere null. Vedo anche che non ha parametri, quindi non hai da passare argomenti (da Java 5 invoke è un metodo "varargs", puoi letteralmente passare nulla, prima di Java 5 avresti dovuto creare esplicitamente un array "vuoto").

    Quindi alla fin fine: getPanel.invoke(null);

    Poi se è appropriato o meno che quel metodo sia static .... non lo so, dipende dalla architettura che hai realizzato e non saprei dire senza vedere meglio tutto il contesto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di joker06
    Registrato dal
    Dec 2006
    Messaggi
    782
    Ciao, scusa se rispondo solo ora ma la giornata di ieri che dedicavo a Java è saltata causa imprevisti xD

    Ho modificato un pochino il codice in questa maniera:

    codice:
    public void actionPerformed(ActionEvent ae) {
            String comStr = ae.getActionCommand();
            //panel(comStr);
            System.out.println(comStr);
            try{
                Method getPanel = Interface.class.getMethod(comStr);
                System.out.println("Public method found: " + getPanel.toString());
                getPanel.invoke(null);
            }
            catch (NoSuchMethodException ex){
                System.out.println("Method either doesn't exist " + "or is not public: " + ex.toString());
            }
        }
    Non passo piu per il metodo panel che mi sembrava solo una stra in piu ma lancio il try direttamente dentro

    codice:
    public void actionPerformed(ActionEvent ae) {
            String comStr = ae.getActionCommand();
            //panel(comStr);
            System.out.println(comStr);
            try{
                Method getPanel = Interface.class.getMethod(comStr);
                System.out.println("Public method found: " + getPanel.toString());
                getPanel.invoke(null);
            }
            catch (NoSuchMethodException ex){
                System.out.println("Method either doesn't exist " + "or is not public: " + ex.toString());
            }
        }
    ricevo pero un errore di questo tipo durante la scrittura del codice:

    Multiple markers at this line
    - Unhandled exception type
    InvocationTargetException
    - Unhandled exception type
    IllegalAccessException

    Dopo l'esecuzione:
    Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problems:
    Unhandled exception type IllegalAccessException
    Unhandled exception type InvocationTargetException

    Alla riga in cui faccio
    codice:
    getPanel.invoke(null);
    Ultima modifica di joker06; 07-10-2014 a 15:11

  6. #6
    Utente di HTML.it L'avatar di joker06
    Registrato dal
    Dec 2006
    Messaggi
    782
    codice:
    	public void actionPerformed(ActionEvent e) {
    	    String comStr = e.getActionCommand();
    	    //panel(comStr);
    	    System.out.println(comStr);
    	    //Method getPanel = Interface.class.getMethod(comStr);
    	    try{
    	    	
    	    	Method getPanel = Interface.class.getMethod(comStr); 
                //Method getPanel = Interface.getDeclaredMethod(comStr); 
                //System.out.println("Public method found: " + getPanel.toString());
                Object result = null;
                //getPanel.invoke(null);
        	    	getPanel.setAccessible(true); // here
        	    	result = getPanel.invoke(getPanel);
    	    }
                catch (Exception a) {
        	    		a.printStackTrace();
            }
    sono arirvato a questo punto e mi mostra nella console degli errori:
    codice:
    java.lang.IllegalArgumentException: object is not an instance of declaring class
    	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:483)
    	at Interface.actionPerformed(Interface.java:137)
    	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    	at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
    	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
    	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
    	at java.awt.Component.processMouseEvent(Component.java:6527)
    	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    	at java.awt.Component.processEvent(Component.java:6292)
    	at java.awt.Container.processEvent(Container.java:2234)
    	at java.awt.Component.dispatchEventImpl(Component.java:4883)
    	at java.awt.Container.dispatchEventImpl(Container.java:2292)
    	at java.awt.Component.dispatchEvent(Component.java:4705)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
    	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
    	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
    	at java.awt.Container.dispatchEventImpl(Container.java:2278)
    	at java.awt.Window.dispatchEventImpl(Window.java:2739)
    	at java.awt.Component.dispatchEvent(Component.java:4705)
    	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
    	at java.awt.EventQueue.access$400(EventQueue.java:97)
    	at java.awt.EventQueue$3.run(EventQueue.java:697)
    	at java.awt.EventQueue$3.run(EventQueue.java:691)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
    	at java.awt.EventQueue$4.run(EventQueue.java:719)
    	at java.awt.EventQueue$4.run(EventQueue.java:717)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    	at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
    Ultima modifica di joker06; 07-10-2014 a 18:21

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da joker06 Visualizza il messaggio
    result = getPanel.invoke(getPanel);

    java.lang.IllegalArgumentException: object is not an instance of declaring class
    Che senso ha, secondo te, passare a invoke l'oggetto Method che è quello su cui stai invocando invoke? Scusa ma ... stai facendo tentativi a caso?

    Il primo argomento è l'oggetto su cui verrà invocato il metodo rappresentato dal Method. Serve solo se è "di istanza", altrimenti se il metodo è statico, è sufficiente passare null (i metodi statici sono associati alla classe ... non alle istanze della classe).

    Se il metodo è pubblico in un tipo pubblico, non c'è nemmeno bisogno di setAccessible o altri "truschini".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it L'avatar di joker06
    Registrato dal
    Dec 2006
    Messaggi
    782
    No, in realtà avevo modificato il metodo da invocare e non era piu static.

    Ho rimesso
    codice:
    result = getPanel.invoke(null);
    ed ora mi sputa fuori il
    codice:
    java.lang.NullPointerException
    	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:483)
    	at Interface.actionPerformed(Interface.java:134)
    	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    	at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
    	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
    	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
    	at java.awt.Component.processMouseEvent(Component.java:6527)
    	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    	at java.awt.Component.processEvent(Component.java:6292)
    	at java.awt.Container.processEvent(Container.java:2234)
    	at java.awt.Component.dispatchEventImpl(Component.java:4883)
    	at java.awt.Container.dispatchEventImpl(Container.java:2292)
    	at java.awt.Component.dispatchEvent(Component.java:4705)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
    	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
    	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
    	at java.awt.Container.dispatchEventImpl(Container.java:2278)
    	at java.awt.Window.dispatchEventImpl(Window.java:2739)
    	at java.awt.Component.dispatchEvent(Component.java:4705)
    	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
    	at java.awt.EventQueue.access$400(EventQueue.java:97)
    	at java.awt.EventQueue$3.run(EventQueue.java:697)
    	at java.awt.EventQueue$3.run(EventQueue.java:691)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
    	at java.awt.EventQueue$4.run(EventQueue.java:719)
    	at java.awt.EventQueue$4.run(EventQueue.java:717)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    	at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
    che cerchero di capire il perche.

    In realtà sono abbastanza confuso, cerco di leggere le guide e vedere un po siasu internet che sul manuale che ho ma mi intrippo sempre, guardo esempi etc ma se mi sembra di sistemare una cosa poi mi si genera un altro errore

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da joker06 Visualizza il messaggio
    No, in realtà avevo modificato il metodo da invocare e non era piu static.
    Visto che il metodo lo cerchi nella classe Interface .... allora dovrai passare una istanza di Interface. Che è il tuo frame, quindi presumo hai una istanza ... no?

    Quote Originariamente inviata da joker06 Visualizza il messaggio
    Ho rimesso
    codice:
    result = getPanel.invoke(null);
    ed ora mi sputa fuori il
    codice:
    java.lang.NullPointerException
    che cerchero di capire il perche.
    C'è poco da capire .... è come se tu facessi (senza reflection):

    codice:
    Interface i = null;
    
    i.unMetodoDiIstanza();

    Invocare un metodo di istanza su un null ovviamente causa NullPointerException.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it L'avatar di joker06
    Registrato dal
    Dec 2006
    Messaggi
    782
    questa è interface:

    codice:
    public class Interface extends JFrame implements ActionListener{
    ok creando l'istanza
    Interface .... = new Interface();

    correttamente mi va al JPanel indicato pero lo fa aprendo una nuova finestra del programma e quindi ho 2 finestre aperte. Comunque grazie per il tuo tempo e scusa del disturbo

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.