Invoke method through Java Reflection API : 方法 « 映射 « Java

En
Java
1. 图形用户界面
2. 三维图形动画
3. 高级图形
4. 蚂蚁编译
5. Apache类库
6. 统计图
7. 
8. 集合数据结构
9. 数据类型
10. 数据库JDBC
11. 设计模式
12. 开发相关类
13. EJB3
14. 电子邮件
15. 事件
16. 文件输入输出
17. 游戏
18. 泛型
19. GWT
20. Hibernate
21. 本地化
22. J2EE平台
23. 基于J2ME
24. JDK-6
25. JNDI的LDAP
26. JPA
27. JSP技术
28. JSTL
29. 语言基础知识
30. 网络协议
31. PDF格式RTF格式
32. 映射
33. 常规表达式
34. 脚本
35. 安全
36. Servlets
37. Spring
38. Swing组件
39. 图形用户界面
40. SWT-JFace-Eclipse
41. 线程
42. 应用程序
43. Velocity
44. Web服务SOA
45. 可扩展标记语言
Java 教程
Java » 映射 » 方法屏幕截图 
Invoke method through Java Reflection API
Invoke method through Java Reflection API
 
/*
 * Copyright (c) 2000 David Flanagan.  All rights reserved.
 * This code is from the book Java Examples in a Nutshell, 2nd Edition.
 * It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied.
 * You may study, use, and modify it for any non-commercial purpose.
 * You may distribute it non-commercially as long as you retain this notice.
 * For a commercial use license, or to purchase the book (recommended),
 * visit http://www.davidflanagan.com/javaexamples2.
 */

import java.awt.event.*;
import java.beans.*;
import java.lang.reflect.*;
import java.io.*;
import java.util.*;

/**
 * This class represents a Method, the list of arguments to be passed to that
 * method, and the object on which the method is to be invoked. The invoke()
 * method invokes the method. The actionPerformed() method does the same thing,
 * allowing this class to implement ActionListener and be used to respond to
 * ActionEvents generated in a GUI or elsewhere. The static parse() method
 * parses a string representation of a method and its arguments.
 */
public class Command implements ActionListener {
  Method m; // The method to be invoked

  Object target; // The object to invoke it on

  Object[] args; // The arguments to pass to the method

  // An empty array; used for methods with no arguments at all.
  static final Object[] nullargs = new Object[] {};

  /** This constructor creates a Command object for a no-arg method */
  public Command(Object target, Method m) {
    this(target, m, nullargs);
  }

  /**
   * This constructor creates a Command object for a method that takes the
   * specified array of arguments. Note that the parse() method provides
   * another way to create a Command object
   */
  public Command(Object target, Method m, Object[] args) {
    this.target = target;
    this.m = m;
    this.args = args;
  }

  /**
   * Invoke the Command by calling the method on its target, and passing the
   * arguments. See also actionPerformed() which does not throw the checked
   * exceptions that this method does.
   */
  public void invoke() throws IllegalAccessException,
      InvocationTargetException {
    m.invoke(target, args)// Use reflection to invoke the method
  }

  /**
   * This method implements the ActionListener interface. It is like invoke()
   * except that it catches the exceptions thrown by that method and rethrows
   * them as an unchecked RuntimeException
   */
  public void actionPerformed(ActionEvent e) {
    try {
      invoke()// Call the invoke method
    catch (InvocationTargetException ex) { // but handle the exceptions
      throw new RuntimeException("Command: "
          + ex.getTargetException().toString());
    catch (IllegalAccessException ex) {
      throw new RuntimeException("Command: " + ex.toString());
    }
  }

  /**
   * This static method creates a Command using the specified target object,
   * and the specified string. The string should contain method name followed
   * by an optional parenthesized comma-separated argument list and a
   * semicolon. The arguments may be boolean, integer or double literals, or
   * double-quoted strings. The parser is lenient about missing commas,
   * semicolons and quotes, but throws an IOException if it cannot parse the
   * string.
   */
  public static Command parse(Object target, String textthrows IOException {
    String methodname; // The name of the method
    ArrayList args = new ArrayList()// Hold arguments as we parse them.
    ArrayList types = new ArrayList()// Hold argument types.

    // Convert the string into a character stream, and use the
    // StreamTokenizer class to convert it into a stream of tokens
    StreamTokenizer t = new StreamTokenizer(new StringReader(text));

    // The first token must be the method name
    int c = t.nextToken()// read a token
    if (c != t.TT_WORD// check the token type
      throw new IOException("Missing method name for command");
    methodname = t.sval; // Remember the method name

    // Now we either need a semicolon or a open paren
    c = t.nextToken();
    if (c == '(') { // If we see an open paren, then parse an arg list
      for (;;) { // Loop 'till end of arglist
        c = t.nextToken()// Read next token

        if (c == ')') { // See if we're done parsing arguments.
          c = t.nextToken()// If so, parse an optional semicolon
          if (c != ';')
            t.pushBack();
          break// Now stop the loop.
        }

        // Otherwise, the token is an argument; figure out its type
        if (c == t.TT_WORD) {
          // If the token is an identifier, parse boolean literals,
          // and treat any other tokens as unquoted string literals.
          if (t.sval.equals("true")) { // Boolean literal
            args.add(Boolean.TRUE);
            types.add(boolean.class);
          else if (t.sval.equals("false")) { // Boolean literal
            args.add(Boolean.FALSE);
            types.add(boolean.class);
          else // Assume its a string
            args.add(t.sval);
            types.add(String.class);
          }
        else if (c == '"') { // If the token is a quoted string
          args.add(t.sval);
          types.add(String.class);
        else if (c == t.TT_NUMBER) { // If the token is a number
          int i = (intt.nval;
          if (i == t.nval) { // Check if its an integer
            // Note: this code treats a token like "2.0" as an int!
            args.add(new Integer(i));
            types.add(int.class);
          else // Otherwise, its a double
            args.add(new Double(t.nval));
            types.add(double.class);
          }
        else // Any other token is an error
          throw new IOException("Unexpected token " + t.sval
              " in argument list of " + methodname + "().");
        }

        // Next should be a comma, but we don't complain if its not
        c = t.nextToken();
        if (c != ',')
          t.pushBack();
      }
    else if (c != ';') { // if a method name is not followed by a paren
      t.pushBack()// then allow a semi-colon but don't require it.
    }

    // We've parsed the argument list.
    // Next, convert the lists of argument values and types to arrays
    Object[] argValues = args.toArray();
    Class[] argtypes = (Class[]) types.toArray(new Class[argValues.length]);

    // At this point, we've got a method name, and arrays of argument
    // values and types. Use reflection on the class of the target object
    // to find a method with the given name and argument types. Throw
    // an exception if we can't find the named method.
    Method method;
    try {
      method = target.getClass().getMethod(methodname, argtypes);
    catch (Exception e) {
      throw new IOException("No such method found, or wrong argument "
          "types: " + methodname);
    }

    // Finally, create and return a Command object, using the target object
    // passed to this method, the Method object we obtained above, and
    // the array of argument values we parsed from the string.
    return new Command(target, method, argValues);
  }
  public static void main(String[] argsthrows IOException {
    javax.swing.JFrame f = new javax.swing.JFrame("Command Test");
    javax.swing.JButton b1 = new javax.swing.JButton("Tick");
    javax.swing.JButton b2 = new javax.swing.JButton("Tock");
    javax.swing.JLabel label = new javax.swing.JLabel("Hello world");
    java.awt.Container pane = f.getContentPane();

    pane.add(b1, java.awt.BorderLayout.WEST);
    pane.add(b2, java.awt.BorderLayout.EAST);
    pane.add(label, java.awt.BorderLayout.NORTH);

    b1.addActionListener(Command.parse(label, "setText(\"tick\");"));
    b2.addActionListener(Command.parse(label, "setText(\"tock\");"));

    f.pack();
    f.show();
  }
}

           
         
  
Related examples in the same category
1. 方法反射
2. Load a method on the fly
3. 演示如何获取信息的具体方法
4. 类反射:查看方法类反射:查看方法
5. 对象反射:调用方法对象反射:调用方法
6. 要调用方法
7. 用一个静态方法获取类的名字
8. 动态调用方法(反射)
9. Call a class method with 2 arguments
10. 使用反射来显示所有类方法
11. 取得某一特定的方法,并调用它
12. 查看载入中的类并查找调动其主要方法查看载入中的类并查找调动其主要方法
13. 显示动态使用方法
14. 演示各种方法调用问题
15. An invocation handler that counts the number of calls for all methods in the target class.
16. Method modifiers: isSynthetic(), m.isVarArgs(), m.isBridge()
17. Call private method
18. 获取一类对象的方法
19. 使用方法类调用一个方法
20. The next example calls a class method with 2 arguments:
21. Getting the Methods of a Class Object: By obtaining a list of all declared methods
22. Getting the Methods of a Class Object: By obtaining a list of all public methods, both declared and inherited.
23. Getting the Methods of a Class Object: By obtaining a particular Method object.
24. 获取当前的方法名称
25. 获取当前的方法名称JDK1.5
26. 从类中获取所有声明的方法
27. Make methods that have unspecified number of parameters:pass an array of Objects
28. Get all methods including the inherited method. Using the getMethods(), we can only access public methods.
www.java2java.com | Contact Us
Copyright 2010 - 2030 Java Source and Support. All rights reserved.
All other trademarks are property of their respective owners.