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

Java 如何通过反射调用非静态方法而不在同一类中创建新实例?,java,reflection,Java,Reflection,我知道如何通过反射调用方法,它会创建一个新实例。但我不能那样做。因为我的类实现了Runnable接口,所以我必须在新线程中启动run方法。因此,这是不可取的。 我现在的代码是: public class Validation () impelements Runnable { Validation (String[] methodName) { if(methodName[2].equals("deposit") ){ this.deposit(account);

我知道如何通过反射调用方法,它会创建一个新实例。但我不能那样做。因为我的类实现了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();
}
我需要这样的东西(不创建类的新实例,但应该是反射):

更新

如果else应替换为以下内容:

try {
this.invoke(methodName[2] , account);
} catch (Exceotion ex){
 // something
}
$methodName = $array[2] ;
$this.methodName();
try {
    Method m = this.getClass().getMethod(methodName[2], account.getClass());
    m.invoke(this, account);
} catch (Exception ex){
 // something
}
我不能使用静态存款或取款方法,它们使用的是非静态变量。

在php中,我们有如下模拟:

try {
this.invoke(methodName[2] , account);
} catch (Exceotion ex){
 // something
}
$methodName = $array[2] ;
$this.methodName();
try {
    Method m = this.getClass().getMethod(methodName[2], account.getClass());
    m.invoke(this, account);
} catch (Exception ex){
 // something
}
我的问题是:

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

这是不可能的

试想一下,非静态方法与类的对象相链接,而不是与类本身相链接

所以,要调用它们,您需要类的实例

不过,如果您想调用一个带有反射的非静态方法,但不进行实例化,这将是另一回事。

这是不可能的

试想一下,非静态方法与类的对象相链接,而不是与类本身相链接

所以,要调用它们,您需要类的实例


不过,如果您想调用带有反射的非静态方法,但不进行实例化,这将是另一回事。

为清楚起见,省略异常处理

class ObjectThatImplementsFoo {
    public void foo() {
    }
}

public void invokeFooOnObject(ObjectThatImplementsFoo foo) {
   Method m = foo.getClass().getMethod("foo");
   m.invoke(foo, null);
}
因此,您的“if-else”应替换为以下内容:

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

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

class ObjectThatImplementsFoo {
    public void foo() {
    }
}

public void invokeFooOnObject(ObjectThatImplementsFoo foo) {
   Method m = foo.getClass().getMethod("foo");
   m.invoke(foo, null);
}
因此,您的“if-else”应替换为以下内容:

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

你不能。这是不可能的。您需要一个实例来调用实例方法。您不能这样做。试想一下,如果没有对象,你怎么能调用一个对象方法(可以修改它的状态)?你是在问如何通过对现有对象的反射来调用一个方法吗?我不理解你的问题。您会说“我知道如何通过反射调用方法”,这对于一个已经存在的对象来说非常有效。没有必要“创建新对象”。@JimGarrison请再次查看,我已经更改了一些您无法更改的内容。这是不可能的。您需要一个实例来调用实例方法。您不能这样做。试想一下,如果没有对象,你怎么能调用一个对象方法(可以修改它的状态)?你是在问如何通过对现有对象的反射来调用一个方法吗?我不理解你的问题。您会说“我知道如何通过反射调用方法”,这对于一个已经存在的对象来说非常有效。没有必要“创建新对象”。@JimGarrison请再次查看,我已经更改了一些内容