Come parte dello sviluppo di un piccolo ScriptEngine, richiamo in modo riflessivo i metodi java. Una chiamata dal motore di script mi fornisce l'oggetto il nome del metodo e un array di argomenti. Per chiamare il metodo ho provato a risolverlo con una chiamata a Class.getMethod (nome, tipi di argomenti).
Ciò tuttavia funziona solo quando le classi degli argomenti e le classi previste dal metodo sono uguali.Chiamare il metodo di adattamento più vicino
Object o1 = new Object();
Object out = System.out;
//Works as System.out.println(Object) is defined
Method ms = out.getClass().getMethod("println",o1.getClass());
Object o2 = new Integer(4);
//Does not work as System.out.println(Integer) is not defined
Method mo = out.getClass().getMethod("println",o2.getClass());
Vorrei sapere se c'è un modo "semplice" per ottenere il giusto metodo, se possibile con la misura più vicina per i tipi di argomento, o se devo implementare questa me stesso.
in forma più vicina potrebbe essere:
Object o1 = new Integer(1);
Object o2 = new String("");
getMethod(name, o1.getClass())//println(Object)
getMethod(name, o2.getClass())//println(String)
Aggiornamento:
Per chiarire che cosa ho bisogno: il motore di script è un piccolo progetto che scrivo nel mio tempo libero in modo non ci sono regole STRIKT ho da seguire. Quindi ho pensato che selezionando i metodi chiamati dal motore nello stesso modo in cui il compilatore java seleziona i metodi in fase di compilazione solo con il tipo dinamico e non il tipo statico dell'oggetto funzionerebbe. (Con o senza autoboxing)
Questo è quello che prima speravo che il Class.getMethod() avrebbe risolto. Ma Class.getMethod() richiede esattamente le stesse Classi dei tipi di argomenti che il metodo dichiara, usando una sottoclasse si otterrà un tale metodo Eccezione. Ciò può accadere per buone ragioni, ma rende il metodo inutile per me, poiché non conosco in anticipo i tipi di argomenti che si adatterebbero.
Un'alternativa sarebbe chiamare Class.getMethods() e scorrere l'array restituito e provare a trovare un metodo di adattamento. Ciò tuttavia essere complicato se non voglio solo fare il primo metodo di "buono", che mi imbatto in, così ho sperato che ci sarebbe una soluzione esistente, che almeno maniglie:
- fit più vicino: IF arg.getClass() == sottoclassi e metodi m (Superclasse), m (sottoclasse) quindi chiamare m (sottoclasse)
- argomenti variabili: System.out.printf (String, String ...)
Anche il supporto per l'autoboxing sarebbe bello.
Se una chiamata non può essere risolta, può generare un'eccezione (ma (String, Object), ma (Object, String), args = String, String)
(Se l'hai fatto fino a qui, grazie per aver dedicato del tempo a leggerlo :-))
prima definire regole severe per "più vicino", quindi implementazione è un dettaglio. – Bozho
proprio quello che mi stavo chiedendo anch'io. Ma per tutti i risponditori pedanticamente corretti che dicono "Definisci il più vicino", ne ho uno semplice: quello che Java normalmente sceglierebbe (credo a livello di classe). –