根据字符串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();
}
}