2013-07-30 10 views
19

Quindi diciamo che sto cercando di ottenere un metodo da una classe usando Method m = plugin.getClass().getDeclaredMethod("getFile");.Utilizzo di .getDeclaredMethod per ottenere un metodo da una classe che estende un altro

Ma quella classe plugin sta estendendo un'altra classe, che è quella con il metodo getFile. Non sono del tutto sicuro che ciò provocherebbe l'eccezione NoSuchMethodException o meno.

So che la classe che il plugin sta estendendo ha il metodo getFile. Scusa se suono confuso, un po 'stanco.

risposta

55

Sembra che sia sufficiente utilizzare getMethod anziché getDeclaredMethod. Il punto di getDeclaredMethod è che solo trova metodi dichiarati nella classe si sta chiamando su:

Restituisce un oggetto metodo che riflette il metodo dichiarato specificato della classe o interfaccia rappresentata da questo oggetto Class .

Mentre getMethod ha:

C viene cercato per tutti i metodi di corrispondenza. Se non viene trovato alcun metodo di corrispondenza, l'algoritmo di fase 1 viene richiamato ricorsivamente sulla superclasse di C.

che non potrà che trovare pubblici metodi però. Se il metodo che cercate non è pubblico, si dovrebbe ricorsione in alto nella gerarchia di classe da soli, utilizzando getDeclaredMethod o getDeclaredMethods su ogni classe nella gerarchia:

Class<?> clazz = plugin.getClass(); 
while (clazz != null) { 
    Method[] methods = clazz.getDeclaredMethods(); 
    for (Method method : methods) { 
     // Test any other things about it beyond the name... 
     if (method.getName().equals("getFile") && ...) { 
      return method; 
     } 
    } 
    clazz = clazz.getSuperclass(); 
} 
+0

+1, una soluzione migliore che ho avuto. – rgettman

+0

Se aiuta, il motivo per cui sto usando questo è dovuto al fatto che il metodo è privato in primo luogo. Annd quindi modifichi. Va bene, proverò la modifica. – PaulBGD

+0

@Ultimate: Beh sì, è piuttosto importante. Sarebbe stato utile se lo avessi menzionato per cominciare. –

Problemi correlati