如何通过反射调用非静态方法而不在同一个类中创建新实例?

时间:2016-04-15 05:41:34

标签: java reflection

我知道如何通过反射调用方法,它会创建一个新实例。但我无法做到这一点。因为我的类使用了Runnable接口,所以我必须在新线程中启动run方法。所以这不是理想的。 我现在的代码是:

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

我需要这样的东西(没有创建一个新的类实例,但它应该是反射):

更新

if-else应该替换为这样的东西:

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

我不能使用静态存款或取款方式,他们使用的是非静态变量。

php 中,我们有类似这样的东西:

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

我的问题是:

如何通过反射调用非静态方法而不在同一个类中创建新实例?

2 个答案:

答案 0 :(得分:0)

这是不可能的。

考虑一下,非静态方法与类的对象相关联,而不是与类本身相关联。

因此,要调用它们,您需要类的实例。

但是,如果你想用反射来调用非静态方法,但没有实例化,那就不可能了。

答案 1 :(得分:-1)

为清晰起见,省略了异常处理

class ObjectThatImplementsFoo {
    public void foo() {
    }
}

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

所以你的" if-else"应该用更像这样的东西代替:

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