根据字符串java给出的函数名调用函数

根据字符串java给出的函数名调用函数,java,events,reflection,Java,Events,Reflection,我希望能够根据字符串提供的函数名调用函数。差不多 public void callByName(String funcName){ this.(funcName)(); } 我已经搜索了一些lambda函数,但它们不受支持。我想去反思一下,但我对编程有点陌生,所以我对这个主题不太熟悉 当我开始GUI(Swing,swt)编程和事件时,整个问题都是在我的java OOP类中提出来的。我发现使用object.addActionCommand()非常难看,因为我以后需要切换并捕获我想要的确切命

我希望能够根据字符串提供的函数名调用函数。差不多

public void callByName(String funcName){
   this.(funcName)();
}
我已经搜索了一些lambda函数,但它们不受支持。我想去反思一下,但我对编程有点陌生,所以我对这个主题不太熟悉

当我开始GUI(Swing,swt)编程和事件时,整个问题都是在我的java OOP类中提出来的。我发现使用
object.addActionCommand()
非常难看,因为我以后需要切换并捕获我想要的确切命令

我更愿意执行类似于
object.attachFunction(btn1\u click)
的操作,以便在引发事件单击时调用
btn1\u click
函数。

检查Class.forName()以获取给定名称的类定义

如果您有一个包含要运行的方法的接口,并且该类实现了该方法,那么您可以创建一个实例,将其强制转换到该接口并调用该方法

如果您不能假设任何东西,请使用类实例上的反射来获得所需的方法,并使用所需的参数调用它。Sun教程中有一个很好的关于反射的部分。

您可以使用它来获取具有特定名称和参数的方法,然后调用返回的对象:


是的,反射API可以用来实现这一点,但我认为这不是简单按钮事件处理的方式。最好问问如何在您正在使用的GUI框架(Swing、SWT…)中优雅地完成这项工作,我相信一定有比反射更简单的方法。

Java有方法,而不是函数。区别在于方法有类;您需要知道调用该方法的类。如果它是一个实例方法,您需要一个实例来调用它,但这确实意味着您可以轻松地查找该方法:

public void callByName(Object obj, String funcName) throws Exception {
    // Ignoring any possible result
    obj.getClass().getDeclaredMethod(funcName).invoke(obj);
}
请注意,有很多潜在的例外情况,如果您想传入参数,事情会变得更加复杂

如果您谈论的是一种类方法,那么您所做的会略有不同:

public void callClassByName(Class cls, String funcName) throws Exception {
    // Ignoring any possible result
    cls.getDeclaredMethod(funcName).invoke(null);
}

您可能还想使用。

进行探索。以下代码将调用给定名称的公共方法,不带任何参数:

public void callByName(String funcName) {
    try {
        Method method = getClass().getDeclaredMethod(funcName);
        method.invoke(this, new Object[] {});
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
}
public void callByName(String funcName) {
    try {
        Method method = getClass().getDeclaredMethod(funcName);
        method.invoke(this, new Object[] {});
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
}