2016-04-15 3 views
-2

Я знаю, как вызвать метод путем отражения, он создает новый экземпляр. Но я не могу этого сделать. Поскольку мой класс импортировал интерфейс Runnable, я должен запустить метод запуска в новом потоке. Поэтому это нежелательно. Мой код теперь:Как вызвать нестатический метод путем отражения без создания нового экземпляра в том же классе?

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(); 
} 

мне нужно что-то вроде этого (без создания нового экземпляра класса, но это должно быть отражение):

UPDATE:

если-то другой должен заменить с чем-то вроде этого:

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

Я не могу использовать статический депозит или ш ithdraw, они используют нестатические переменные.

В PHP мы simething так:

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

Мой вопрос:

Как вызвать нестатический метод путем отражения без создания нового экземпляра в то же класс?

+1

Вы не можете. Это невозможно. Вам нужен экземпляр для вызова методов экземпляра. – Savior

+2

Вы не можете этого сделать. Подумайте об этом - как вы можете вызвать метод объекта (который может изменить его состояние) без объекта? –

+0

Вы спрашиваете, как вызвать метод путем отражения объекта _existing_? –

ответ

0

Это невозможно.

Просто подумайте об этом, нестатические методы связаны с объектами класса, а не с самим классом.

Итак, чтобы вызвать их, вам нужен экземпляр класса.

Это было бы совсем другое дело, если вы хотите вызвать нестатический метод с отражением, но без создания экземпляра, это невозможно.

-1

обработка исключений опущена для ясности

class ObjectThatImplementsFoo { 
    public void foo() { 
    } 
} 

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

Так что ваши «если-то еще» должно быть заменено чем-то больше, как это:

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