2016-04-15 5 views
-2

Ich weiß, wie man eine Methode durch Reflexion aufruft, sie erstellt eine neue Instanz. Aber ich kann das nicht tun. Da meine Klasse die Runnable-Schnittstelle implementiert hat, muss ich die Methode run in einem neuen Thread starten. Das ist also nicht erwünscht. Mein Code ist jetzt:Wie kann eine nicht statische Methode durch Reflektion aufgerufen werden, ohne dass eine neue Instanz in derselben Klasse erstellt wird?

public class Validation() impelements Runnable { 
    Validation (String[] methodName) { 
    if(methodName[2].equals("deposit")){ 
     this.deposit(account); 
    } 
    else if (methodName[2].equals("withdraw")){ 
     this.withdraw(account); 
    } 
    // lots of if-else 
} 
//..... other methods , deposit() , withdraw() , run(); 
} 

ich so etwas wie dieses benötigen (ohne eine neue Instanz der Klasse zu schaffen, aber es sollte Reflexion sein):

UPDATE:

if-else ersetzen soll mit etwas wie folgt aus:

try { 
this.invoke(methodName[2] , account); 
} catch (Exceotion ex){ 
// something 
} 

ich nicht statisch Ablagerung oder w verwenden können ithdraw-Methoden verwenden sie nicht statische Variablen.

In php wir haben simething wie folgt aus:

$methodName = $array[2] ; 
$this.methodName(); 

Meine Frage ist:

Wie eine nicht-statische Methode durch Reflexion aufzurufen, ohne die Schaffung neuer Instanz in demselben Klasse?

+1

Sie können nicht. Es ist unmöglich. Sie benötigen eine Instanz, um Instanzmethoden aufzurufen. – Savior

+2

Sie können das nicht tun. Denken Sie nur darüber nach - wie können Sie eine Objektmethode (die ihren Zustand ändern kann) ohne das Objekt aufrufen? –

+0

Fragen Sie, wie man eine Methode durch Reflexion an einem _existing_ Objekt aufruft? –

Antwort

0

Dies ist nicht möglich.

Denken Sie nur daran, nicht statische Methoden werden mit Objekten der Klasse verknüpft, und nicht mit der Klasse selbst.

Also, um sie aufzurufen, benötigen Sie Instanz der Klasse.

Es wäre jedoch eine andere Sache, wenn Sie eine nicht-statische Methode mit Reflektion, aber ohne Instantiierung aufrufen möchten, ist es nicht möglich.

-1

Ausnahmebehandlung aus Gründen der Übersichtlichkeit weggelassen

class ObjectThatImplementsFoo { 
    public void foo() { 
    } 
} 

public void invokeFooOnObject(ObjectThatImplementsFoo foo) { 
    Method m = foo.getClass().getMethod("foo"); 
    m.invoke(foo, null); 
} 

Also Ihr "if-else" sollte mit etwas mehr wie folgt ersetzt:

try { 
    Method m = this.getClass().getMethod(methodName[2], account.getClass()); 
    m.invoke(this, account); 
} catch (Exception ex){ 
// something 
} 
Verwandte Themen