我要写一个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);
}
}
是一个消息分派的例子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);
}
}
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);
}
}
map.put(menuItemText, menuName);
...// 其它代码
}用的使用
JMenu m = map.get(menuItemText); 就可以直接调用对应的JMenu的功能了!
下面的例子只是针对你这个问题给出的一个示例 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");
}
}
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)