我希望能够根据字符串提供的名称来调用函数。像
这样的东西public void callByName(String funcName){
this.(funcName)();
}
我已经搜索了一些lambda函数,但它们不受支持。我正在考虑选择反思,但我对编程有点新意,所以我对这个主题并不熟悉。
当我开始GUI(Swing,swt)编程和事件时,整个问题都出现在我的java OOP类中。我发现使用object.addActionCommand()
非常难看,因为我后来需要创建一个Switch并捕获我想要的确切命令。
我宁愿做object.attachFunction(btn1_click)
之类的事情,以便在引发事件点击时调用btn1_click
函数。
答案 0 :(得分:6)
Java有方法,而不是函数。不同之处在于方法有类;你需要知道要调用方法的类。如果它是一个实例方法,你需要一个实例来调用它,但OTOH确实意味着你可以轻松地查看方法:
public void callByName(Object obj, String funcName) throws Exception {
// Ignoring any possible result
obj.getClass().getDeclaredMethod(funcName).invoke(obj);
}
请注意,除此之外还有 lot 潜在异常,如果您想传递参数,事情会变得更复杂。
如果你在谈论一种课堂方法,你所做的就是略有不同:
public void callClassByName(Class cls, String funcName) throws Exception {
// Ignoring any possible result
cls.getDeclaredMethod(funcName).invoke(null);
}
您可能还想使用java.lang.reflect.Proxy
进行探索。
答案 1 :(得分:2)
以下代码将调用给定名称的公共方法,不带参数:
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();
}
}
答案 2 :(得分:1)
您可以使用Class.getDeclaredMethod()
获取具有特定名称和参数的方法,然后调用返回的Method
对象:
Method method = MyClass.class.getDeclaredMethod("methodName", Event.class, String.class);
Object retVal = method.invoke(someEvent, someString);
答案 3 :(得分:1)
之前已经问过这个问题。见here
答案 4 :(得分:0)
检查Class.forName()以获取给定名称的类定义。
如果您有一个包含要运行的方法的接口,并且该类实现了此方法,那么您只需创建一个实例,将其强制转换为接口并调用该方法。
如果你不能假设任何东西,可以在类的实例上使用反射来获得你想要的方法,并用它需要的参数调用它。 “太阳教程”有一个很好的反思部分。
答案 5 :(得分:0)
是的,Reflection API可用于执行此操作,但我认为这不是简单按钮事件处理的方法。更好地询问如何在你正在使用的GUI框架中优雅地完成这项工作(Swing,SWT ..),我确信必须有比Reflection更简单的方法。