Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    36

    [Java] Esercizio Reflection

    Sto provando a fare questo esercizio usando la reflection:
    Implementare una classe generica MiniInterprete i cui oggetti sono costruiti a partire da un oggetto del tipo generico specificato
    La classe espone il metodo parse che, data una stringa nel formato nomeMetodo(param1, ..., paramN), invoca il corrispondente metodo con N parametri
    – Si assuma che i tipi dei parametri siano scelti tra: Integer, Boolean, String e Double
    – Si assuma che non esista più di un metodo con lo stesso nome e N parametri
    – Si gestiscano le eccezioni in modo appropriato
    Ad esempio:
    – new MiniInterprete(“ciao”).parse(“length()”) restituisce 4
    – new MiniInterprete(“ciao”).parse(“charAt(3)”) restituisce ‘o’

    Il codice che ho scritto però non funziona:
    codice:
    import java.lang.reflect.*;
    
    
    public class MiniInterprete<T> {
    
    	Class<?> c;
    	T valore;
    	
    	public MiniInterprete (Class<T> type, T valore){		
    		c=valore.getClass();
    	
    	}
    	
    	public Object parse(String stringa){
    		int spazi=0;
    		char temp=stringa.charAt(0);
    		for(int i=0;i<stringa.length() && temp!='(';i++){
    			temp=stringa.charAt(i);
    			spazi++;
    		}
    			
    		String nomeMetodo=stringa.substring(0, spazi-1);
    		String listaParametri=stringa.substring(spazi, stringa.length()-1);
    		
    		Object[] parametri=listaParametri.split(",");
    		
    		Method[] metodi=c.getDeclaredMethods();
    
    		try {
    			for(Method m: metodi)
    				if(m.getName().equals(nomeMetodo))					
    					return m.invoke(valore, parametri);
    				
    		}  catch (SecurityException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalArgumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InvocationTargetException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		
    		return null;
    	}
    	
    	
    	public static void main(String[] args) {
    		String s="length()";
    
    		MiniInterprete<String> mini=new MiniInterprete<String>(String.class,"ciao");
    		System.out.println(mini.parse(s));
    	}
    
    }
    Quando l'esecuzione arriva a return m.invoke(valore, parametri); mi solleva questa eccezione
    Exception in thread "main" java.lang.NullPointerException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Nativ e Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Native MethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(De legatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at MiniInterprete.parse(MiniInterprete.java:32)
    at MiniInterprete.main(MiniInterprete.java:57)

    Perchè non riesce ad invocare il metodo?
    Grazie

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326

    Moderazione

    Spostato nel forum corretto... quello Java.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    cosa fai alla riga 32 di parse? qualcosa vale null? qualcosa della funzione chiamata vale null?
    RTFM Read That F*** Manual!!!

  4. #4
    con un debug controlla che
    codice:
    Method[] metodi=c.getDeclaredMethods();
    l'array metodi contenga qualcosa oppure c.getDeclaredMethods() gli passi null perché a quanto pare la seconda ipotesi è la più veritiera...
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

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.