如何在 java 中将名称函数和实际函数联系起来



我正在用 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。这是本教程的链接。

这取决于你,你使用上述两个中的哪一个。

相关内容

  • 没有找到相关文章

最新更新