2012-03-30 2 views
0

ein Verfahrens in Delegaten BetrachtenWie die Methode Karte Schnittstelle und Klasse mit - von der Aktion zu delegieren

Public void findThisMethod(String a,Set b,HashSet c){} 

So von Aktion am gng diese Methode mit der Methode id und Argumente zur Karte types..by verwenden.

Object[] arguments = new Object[] {a,b,c} 
    for (int i = 0 ; i < arguments.length ; i++){ 
     argumentTypes[i] = arguments[i].getClass(); 
    } 
Method invokeMethod = delegateClass.getDeclaredMethod(methodID,argumentTypes); 
returnObj   = invokeMethod.invoke(delegateObj,arguments); 

... Problem :: Dies ist nicht wotking Seit Set ist eine Schnittstelle !!! Kann mir jemand sagen, wie man die Schnittstelle richtig abbildet ????

+1

Wie in Ihrer anderen Frage erklärt, * Sie können nicht * das von Argument gerade tun Werte. Wenn Sie * alle * deklarierten Methoden bekommen können, können Sie zumindest * kompatible * Methoden finden, aber das ist nicht dasselbe. –

Antwort

1

Wenn Sie nach der Signatur einer Methode suchen, die getDeclaredMethod verwendet, sollten Sie die genauen Typen der Pameter dieser Signatur angeben, nicht die Unterklassen. Subclassing wird vom Compiler gelöst, hilft aber nicht bei der Introspektion.

Geben Sie explizit die Typen der Parameter an, holen Sie sie nicht von Objekten, wie Sie es tun. Sie sollten so etwas wie

delegateClass.getDeclaredMethod(methodID, new Class[] { String.class, Set.class, HashSet.class }); 
+0

Hi .. Betrachten wir Set b ... ist es möglich, den umgekehrten Prozess zu finden .. dh .. wat ist der Typ von b ... ex .. für String a können wir von a.getClass() bekommen. Es gibt einen Weg, um die Schnittstelle zu finden, –

+1

Sie können die Methode durch rekursive versuchen alle Supertypen und Schnittstellen von Ihren Objekten implementiert, aber das ist ein gieriger Prozess – Snicolas

+0

oh .. So traurig .. So ist es nicht möglich, den Typ zu finden der Schnittstelle? –

1

Im Allgemeinen müssen Sie den gleichen Aufwand wie der Compiler ausgeben, wenn Sie versuchen, die beste Überlademethode für einen Methodenaufruf auszuwählen.

In Ihrem Fall müssen Sie testen, ob für die angegebenen Argumente eine Methode existiert a, b, c. Wenn nicht, dann müssen Sie die Supertypen und Schnittstellen betrachten.

Sie können es möglicherweise umgekehrt tun: Holen Sie sich die Menge der verfügbaren Methoden und erstellen Sie eine priorisierte Liste von Kandidatenmethoden für den Argumentvektor.

Verwandte Themen