如何在函数名称和java中的实际函数之间建立链接

时间:2011-12-13 10:15:57

标签: java actionlistener jtoolbar

我正在使用多个工具栏在netBeans中构建用户界面(手动编码,更灵活)。

我要做的是为每个按钮创建一个actionListener。我正在从XML中检索函数的名称并将它们解析为字符串。我将在单独的类中编写这些函数的实现,但我的问题如下:

如何在函数名和包含它名称的字符串之间建立链接?

示例:字符串为Open(),函数为Open(someParameter),定义类中将为static void Open(param)

3 个答案:

答案 0 :(得分:1)

在我看来,你正在寻找Java中的JS“eval”函数。 This可能有所帮助。然而,正如@Max所说,它通常不是一个好主意,你可能想重新考虑你的设计。

答案 1 :(得分:1)

首先,考虑一下我对从字符串解决的动态按钮行为的想法的评论是错误的方法。但是,如果您仍然需要您提出的问题,那么您需要的是Reflection 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()来处理按钮的点击。

答案 2 :(得分:0)

如果我已正确理解您的问题,您将尝试根据从XML文件中获取的某些字符串生成代码文件。我可以建议您library生成您的代码。 对于教程,您可以访问this链接。 您甚至可以使用Java Reflection API。这是教程的link

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