我要写一个METHOD,类似于其他语言的方法或过程,要求如下:在一个函数中通过参数调用自身类中的其他方法,如果调用,如何执行?如下例子:
是一个消息分派的例子public class AMenu extends JMenuBar {
public AMenu()
{
JMenu menu = new JMenu("File");
add(menu);

JMenuItem openItem = addJMenuItem(menu,"Open");

JMenuItem exitItem = addJMenuItem(menu,"Exit");
addJMenuItemAction(exitItem, "actionExit");
//上一句需要将MenuItem项与Action关联起来,问题集中于此, 此处这样写是调用示例
}

public JMenuItem addJMenuItem(JMenu menuName, String menuItemText)
{
JMenuItem newMenuItemName;

newMenuItemName = new JMenuItem(menuItemText);
menuName.add(newMenuItemName);
return newMenuItemName;
}

public void addJMenuItemAction(JMenuItem menuItemName, String methodName)
        //此处方法请大家考虑一下如何写?
{
menuItemName.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
         \\如何在此处引用并调用函数?如调用下面的actionExit()                  \\此处,我并不希望在此处直接写代码,如System.exit(0);等,我是希望写成一个通用方法,以后直接扩展如actionExit()的方法,来调用关联,作消息的分派使用
}
}
);
}

public final void actionExit()
{
System.exit(0);
}
}

解决方案 »

  1.   

    这个用java 反射 可以实现.写个小例子,参考一下.public class TestT {

    public String getStr(){
    return "hello";
    }

    public void printStr(String str){
    System.out.println("P:"+str);
    }

    public static void main(String[] args) throws Exception{

    TestT t = new TestT();

    Method m1 = t.getClass().getMethod("getStr", new Class<?>[0]);

    String str = (String)m1.invoke(t, new Object[0]);

    Method m2 = t.getClass().getMethod("printStr", String.class);

    m2.invoke(t, str);


    }
    }
      

  2.   

    你可以用HashMap,把menuItemText和menuName关联起来,  HashMap<String, JMenu> map = new HashMap<String, JMenu>();  public JMenuItem addJMenuItem(JMenu menuName, String menuItemText) {
        map.put(menuItemText, menuName);
        ...// 其它代码
      }用的使用
    JMenu m = map.get(menuItemText); 就可以直接调用对应的JMenu的功能了!
      

  3.   

    有时间去看看Java Reflection方面的文章,这方面的文章在网上是比较多的。
    下面的例子只是针对你这个问题给出的一个示例 import java.lang.reflect.Method;
    import java.lang.reflect.InvocationTargetException;// 演示类,method1和method2作一般演示,method3做抛出异常的演示
    // invoke是根据方法名调用方法的演示
    class Demo {
        public final void method1() {
            System.out.println("Demo.method1()");
        }
        
        public final void method2() {
            System.out.println("Demo.method2()");
        }
        
        public final void method3() {
            throw new RuntimeException("Testing");
        }
        
        public final void invoke(String name) {
            try {
                Method method = getClass().getMethod(name, new Class[0]);
                method.invoke(this, new Object[0]);
            } catch (NoSuchMethodException e) {
                System.out.println("No method found: " + name);
            } catch (IllegalAccessException e) {
                System.out.println("Cannot access method: " + name);
            } catch (InvocationTargetException e) {
                System.out.println("Method throws exception:");
                e.getCause().printStackTrace();
            }
        }
    }// 演示主程序
    public class Test {
        public static final void main(String[] args) {
            Demo demo = new Demo();
            demo.invoke("method1");
            demo.invoke("method2");
            demo.invoke("nomethod");
            demo.invoke("method3");
        }
    }
      

  4.   

    给你偷点懒,也给大家看看,下面是刚才那个示例程序的结果
    F:\>javac Test.java && java Test
    javac Test.java && java Test
    Demo.method1()
    Demo.method2()
    No method found: nomethod
    Method throws exception:
    java.lang.RuntimeException: Testing
    at Demo.method3(Test.java:14)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at Demo.invoke(Test.java:20)
    at Test.main(Test.java:38)
      

  5.   

    有空看下. java.beans.EventHandler