使用反射来调用类的方法,需要使用java.lang.reflect.Method中的invoke方法,Object??invoke(Object obj, Object[] args),第一个参数是指需要调用的那个方法的隐式参数,也即那个方法所属的对象,如果调用的是一个静态方法将第一个参数指定为null,第二个参数是指需要调用的那个方法的显式参数,因为一个方法可以有很多个参数所以在这里我们必须用一个数组来存放这些参数,注意这个方法使用的是对象数组,在存放时尽管有值类型我们也要把相应的包装器类存放进去,当调用的这个方法有返回值,这在Java中是一个令人烦恼的问题,如果返回来的是一个对象还好,我们只需将invoke返回的Object强制转换成特定的对象就可以,可是返回一个值类型呢?我们要使用就麻烦了,首先要对其解包装,在用其包装对象的方法返回普通值!我们编程思路很重要是吧!编程的基本思路:首先获得需要被调用的方法的指针,其实说指针不是那么好理解,而java的方法指针也一度的引起很大的争论,我们干脆叫引用吧!怎么获的引用呢?可使用Class类的getMethod方法该方法返回一个Method,接着我们在使用Method的invoke方法调用这个引用所指向的方法,就这么简单,我一直认为用一个简单的例子讲诉一个复杂的概念是最注重实效的!(在JDK1.4下调试通过)import java.lang.reflect.*;public class InvokeMethods
{
 public static void main(String[] args)
 {
                Employee emp = new Employee();
                
                ///getClass获得emp对象所属的类型的对象,Class就是类的类
                ///Class是专门用来描述类的类,比如描述某个类有那些字段,
                ///方法,构造器等等!
                Class cl = emp.getClass();
                try
                {
                    ///getMethod方法第一个参数指定一个需要调用的方法名称
                    ///这里是Employee类的setAge方法,第二个参数是需要调用
                    ///方法的参数类型列表,是参数类型!如无参数可以指定null
                    ///该方法返回一个方法对象
                    Method sAge = cl.getMethod("setAge",
   new Class[] {int.class});
   
                    Method gAge = cl.getMethod("getAge",null);
  
                    Method pName = cl.getMethod("printName",
   new Class[] {String.class});
      
                    /**
        *使用invoke调用指定的方法
       */
                    Object[] args1 = { new Integer(25) };//参数列表
                    //emp为隐式参数该方法不是静态方法必须指定 
                    sAge.invoke(emp, args1);
  
                    Integer AGE = (Integer)gAge.invoke(emp, null);
                    int age = AGE.intValue(); 
                    System.out.println("The Employee Age is: "+age);
  
                    Object[] args3 = {new String("Jack") };
                    pName.invoke(emp, args3);
                }
                catch(Exception e) {e.printStackTrace(); }
                System.exit(0);
 }
 
}class Employee
{
  //定义一个员工类
 public Employee()
 {
  age = 0;
  name = null;
 }
 
//将要被调用的方法
 public void setAge(int a)
 {
  age = a;
 }
 
  //将要被调用的方法
 public int getAge()
 {
  return age;
 }
 
 //将要被调用的方法
 public void printName(String n)
 {
  name = n;
  System.out.println("The Employee Name is: "+name);
 }
 
 private int age;
 private String name;
}

解决方案 »

  1.   

    Java 不是脚本语言,所以不能解释字符串中包含的语句,用反射也不行。
    反射的作用主要是用来调用一些已经存在但是在写程序可能不知道或者不确定的类和方法的。
    bean.getName().equals("北京"); 这样一个语句,
    我想你是想动态生成 “北京” 这样的字符串用于比较是吧?
    既然你可以动态生成 String condition="bean.getName().equals(北京)";
    那么你一定可以动态生成 String condition="北京"; 没错吧
    那么你就可以用 if (bena.getName().equals(condition)) {...} 来进行判断是不?
    那不就得了?!
      

  2.   

    意思就是我这个方法中得到了一个字符串:bean.getName().equals("北京") 我怎么把这个字符串做为if语句的条件来执行
      

  3.   

    问题是equals也是动态的.这个条件语句还有可能是:bean.getMainid()==3之类的
      

  4.   

    用beanshell可以做到执行java脚本。http://www.beanshell.org
      

  5.   

    他的原理是将java代码解析,然后用反射机制运行。它比单纯的反射工具包的强处是可以执行语句。不过java语法还是很烦的,如果追求简单的脚本语法,可以使用mozilla的子项目
    rhino,javascript的java版运行引擎
    http://www.mozilla.org/rhino/SpiderMonkey,javascript的c版运行引擎
    http://www.mozilla.org/js/spidermonkey/有这两个东西,实现公式易如反掌。这是我接触enhydra shark workflow engine所了解的。它的公式解析即为beanshell和rhino单纯实现反射机制的工具:
    jakarta common BeanUtils -- 比较通用和强大
    Spring BeanWrapper -- 感觉一般。
    hibernate ReflectHelper -- 封装了有关cglib的部分
      

  6.   

    为什么不多传几个参数,比如
    String object = "bean";
    String method = "getName";
    String value = "北京";
    然后再反射难道不是很方便吗