2012-03-30 4 views
1

habe einige Argumente sagen (String a, Treeset b, Set c)
zu bekommen und ich versuche, die Klasse von arguments[i].getClass(); der oben genannten Argumente zu bekommen ..
ist Iit möglich, die Klasse der Schnittstelle zu bekommen <Set> .ist es möglich, die Klasse der Schnittstelle <Set>

Zum Beispiel:

Class[] argumentTypes = new Class [arguments.length]; 
for (int i = 0 ; i < arguments.length ; i++) 
{ 
    argumentTypes[i] = arguments[i].getClass(); 
} 
+1

Bitte Leerzeichen verwenden, anstatt Registerkarten, wenn Code-Formatierung auf Stack-Überlauf. –

Antwort

2

Der Code, den Sie gegeben haben, werden die Klassen der Argumente (dh die Werte zur Verfügung gestellt, um das Verfahren) finden - aber diese können niemals Schnittstellen sein; Sie werden immer konkrete Implementierungen sein. (Man kann nie passieren „nur einen Satz.“ - immer einen Verweis auf ein Objekt, das eine Instanz einer Implementierung ist der Schnittstelle, oder eine Nullreferenz)

Es klingt wie Sie die Typen von der wollen Parameter - die Sie über die Reflexion erhalten würden, wenn Sie absolut mussten, die Method finden und dann die Parameter davon mit getParameterTypes bekommen. Aber da Sie innerhalb der Methode sind, kennen Sie bereits die Parameter-Typen, weil sie an der Spitze der Methode sind ... Ich bin mir nicht sicher, der beste Weg, "die derzeit ausführende" Methode zu finden, wenn das ist was du willst.

Wenn Sie nur versuchen, die Klasse Set zugeordnet werden, können Sie natürlich Set.class verwenden. Aber es ist auch nicht wirklich klar, was Sie zu tun versuchen.

EDIT: Okay, nach Ihrem Kommentar zu urteilen, gibt es einige logische Probleme mit dem, was Sie versuchen zu tun. Von den Werten von Argumenten, auf die Methode aufgerufen werden würde, ist im allgemeinen Fall unmöglich, weil Sie Informationen verloren haben. Betrachten Sie diese, zum Beispiel:

void foo(String x) {} 
void foo(Object y) {} 

foo("hello"); // Calls first method 
foo((Object) "hello"); // Calls second method 

Hier werden die Argument Werte gleich sind - aber die Ausdrücke einen anderen Typ haben.

Sie können alle Methoden finden, die wäre gültig für die Argumentwerte - modulo generische Informationen verloren durch Typ löschen - mit Class.isAssignableFrom. Hilft dir das genug?

Beachten Sie, dass Sie auch sorgfältig darüber nachdenken müssen, wie Sie null Argument Werte verarbeiten, die offensichtlich gültig wäre für jede Referenzart Parameter ...

+0

Thankz für die Antwort pal ... eigentlich nehme ich die Klassen und versuche, die deklarierte Methode zu finden und aufzurufen..say..Methode invokeMethod \t = delegateClass.getDeclaredMethod (methodID, argumentTypes); \t \t \t \t \t returnObj = invokeMethod.invoke (delegateObj, Argumente); –

+1

@ user1164885: Siehe meine bearbeitete Antwort für die hier involvierten Probleme ... –

+0

Hallo Kumpel, das ist umgekehrte Frage .... wie ich bereits in Delegate-Klasse gesagt habe gibt es getDeclaredMethod ... Methode invokeMethod = delegateClass.getDeclaredMethod (methodID , argumentTypes); also kombiniere einfach meine beiden code .. und sag mir wie ich die methode finde die eine der argumente als schnittstelle hatte .. nicht klasse –

0

Sie die Klasse bekommen, was der Anrufer zur Verfügung gestellt .

Ich meine, in der unteren Klasse erhalten Sie HashSet.

Set set=new HashSet(); 
System.out.println(set.getClass()); 
0

Sie können dies unter

gegeben auf zwei Arten tun
Set s = new //any class that implements it for example HashSet or TreeSet etc.; 
s.getClass().getName(); //This will return the name of the subclass which is refered by s. 

oder wenn auf andere Weise tun können, es

Set s = null; 
s.getClass();//This causes NullPointer Exception 
+0

, bedeutet dies, dass S.getClass() entweder HashSet oder Treeset zurückgibt .. Ist irgendeine Methode, um als solche zurückzukehren ... ich meine als solche als Schnittstelle ,, –

+0

Eigentlich bin ich mir nicht sicher, aber ich glaube nicht, dass es irgendeine Methode für solche gibt. –

Verwandte Themen