| 

.NET C# Java Javascript Exception

2
Ich habe folgenden Code:

class C {
public void f() {}
public void g() {}
}

String methode = /* "f" oder "g" */;
C c = new C();
//<1>

Bei Punkt <1> möchte ich die Methode, die in der Variablen "methode" steht auf c ausführen. Wie kann ich das machen? c.methode() funktioniert nicht.
17.07.2009
Leroy 315 2 5
3 Antworten
6
Das geht nur per Reflection:

C c = new C(); // Instance der Klasse
String methodName = "f"; // Name der Methode

Method method = C.class.getMethod(methodName, (Class<?>[])null); // Methode per Reflection holen
method.invoke(c, (Object[])null); // Methode ausfuehren
18.07.2009
Fancy 424 1 2
2
super. der zweite Parameter von invoke scheinen die Parameter an die aufgerufene Methode zu sein.
Leroy 18.07.2009
1
Genau, wobei Du dann den zweiten Parameter bei getMethod ebenfalls anpassen musst um die richtige Methode zu bekommen.

Z.B.:
public void h(Integer i){}

Method method = C.class.getMethod(methodName, new Class<?>[] { Integer.class } );
method.invoke(c, new Object[] { 5 });

Fancy 18.07.2009
0
Es gibt nie nur einen Weg ;-)

Es gibt ein Pattern namens "Visitor", das leistet die Anforderung ohne Reflektion (geht also auch in C++). Es sieht im ersten Moment aufwendiger aus, dürfte aber schneller sein, insbesondere, wenn an vielen Stellen (ein ganzes Netzwerk aus Klassen und Objekten) die Entscheidung zwischen den Methoden getroffen werden muss.

Visitor Pattern

Im Gegensatz zu Reflection wo auch Exception geworfen werden können, ist dieser Ansatz typsicher und "Exceptionlos"
interface Visitor {
public void call (Visitee pObject);
}

abstract class Visitee {
public void f ();
public void g ();
public void aufruf (Visitor visi) {
visi.call(this);
}
}

class C extends Visitee{
public void f() {}
public void g() {}
}

class CX extends Visitee{
public void f() {}
public void g() {}
}


class FVisitor implements Visitor
{
void call (Visitee visi)
{
visi.f ();
}
}
class GVisitor implements Visitor
{
void call (Visitee visi)
{
visi.g ();
}
}

C c = new C ();
C c2 = new C ();
CX cx = new CX ();
CX cx2 = new CX ();
Visitor v = new FVisitor () oder new GVisitor ()
c.call (v);
c2.call (v);
cx.call (v);
cx2.call (v);
01.11.2009
stefan.bachert 395 4
-1
Wenn du vorher weißt, welche Methoden es überhaupt sein können, kannst du das auch mit if lösen:

if(methode == "f") c.f();
else if(methode == "g") c.g();
else throw ...;
23.07.2009
sicco 179 2 4
7
Strings sollten (fast) niemals mit == verglichen werden. Richtig wäre if("f".equals(methode))...
Fancy 24.07.2009

Stelle deine Java-Frage jetzt!