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:
Quando l'esecuzione arriva a return m.invoke(valore, parametri); mi solleva questa eccezionecodice: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)); } }
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

Rispondi quotando

