我正在用 netBeans 构建一个具有多个工具栏的用户界面(手动编码,更灵活(。
我正在尝试做的是为每个按钮创建一个 actionListener。我正在从XML中检索函数的名称并将它们解析为字符串。我将在单独的类中为这些函数编写实现,但我的问题如下:
如何在函数名称和包含其名称的字符串之间建立链接?
示例:字符串Open()
,函数将被Open(someParameter)
,并且在定义类中将有static void Open(param)
。
首先,考虑一下我对你关于动态按钮行为的想法的评论,从字符串中解决的是一种错误的方法。但是,如果您仍然需要您所要求的内容,那么您需要的是反射API。
下面是一个示例:
Class c = SomeClassWithMethods.class;
Method m = c.getMethod("someMethodName", String.class, Integer.class, Integer.TYPE);
m.invoke(baseObjectFromWhichToCallTheMethod, "stringParam", 10, 5);
添加:
另一种选择,比反射更漂亮,但仍然是一个混乱的设计,是使用映射将这些Strings
链接到方法。代码有点长,但从 Java 的角度来看,它比在任务中使用反射要好得多(除非你有一些我不知道的特定要求(。这是它的工作原理:
//Interface whose instances will bind strings to methods
interface ButtonClickHandler {
void onClick();
}
class SomeClassYouNeed {
//One of the methods that will be bound to "onButtonOneClick()"
public void onButtonOneClick() {
log.info("ButtonOneClick method is called");
}
public void onButtonTwoClick() {
log.info("ButtonTwoClick method is called");
}
//Map that will hold your links
private static Map<String, ButtonClickHandler> buttonActionMap;
//Static constructor to initialize the map
static {
buttonActionMap = new Map<String, ButtonClickHandler>();
buttonActionMap.put("onButtonOneClick()",new ButtonClickHandler() {
@Override
public void onClick() {
onButtonOneClick();
}
});
buttonActionMap.put("onButtonTwoClick()",new ButtonClickHandler() {
@Override
public void onClick() {
onButtonTwoClick();
}
});
}
public void callByName(String methodName) {
final ButtonClickHandler handler = buttonActionMap.get(methodName);
if (handler == null) {
throw new IllegalArgumentException("No handler found by name: "+methodName);
}
handler.onClick();
}
}
调用callByName("onButtonTwoClick()")
后,它将获取ButtonClickHandler
的相应实例,该实例将使用静态方法onButtonTwoClick()
来处理按钮的单击。
在我看来,您正在寻找 Java 中等效的 JS"eval"函数。这可能会有所帮助。然而,正如@Max所说,这通常不是一个好主意,您可能需要重新考虑您的设计。
如果我正确理解了您的问题,您正在尝试根据从 XML 文件中获取的一些字符串生成代码文件。我可以建议你这个库来生成你的代码。有关教程,您可以访问此链接。您甚至可以使用 Java Reflection API。这是本教程的链接。
这取决于你,你使用上述两个中的哪一个。