2013-03-06 72 views
-1

我有下面的类,当我调用myClass.doprocess()时,我应该得到字符串“海”,我怎么能实现它?执行函数使用JAVA反射

public class myClass{ 
    public int doprocess(){ 
     dataClass objSt = new dataClass(); 
     Class newCls = objSt.getClass(); 
     Method[] methods = newCls.getMethods(); 
     for (Method method : methods) { 
      if(method.getName() == "getList"){ 
       return method; 
      } 

     } 
    } 
} 

class dataClass{ 
    public String getList(){ 
     return "hai,"; 
    } 
} 

如果我执行上面的代码我得到响应,

public java.lang.String com.myproject.controller.dataClass.getList() 

,但我需要的响应是从的GetList函数的返回值

+3

字符串与'.equals(字符串)'' – 2013-03-06 02:48:54

+1

方法method'不是'int'比较。 – 2013-03-06 02:50:42

+0

你的代码不能编译,所以你没有真正地测试过它。你是如何解决编译问题的? – Perception 2013-03-06 02:57:08

回答

1

可以使用getDeclaredMethod获得方法使用给定的名称和参数集,则可以使用Method.invoke(instance, params...)来调用该方法。

class myClass { 
    public String doprocess() throws SecurityException, NoSuchMethodException, 
      IllegalArgumentException, IllegalAccessException, 
      InvocationTargetException { 
     dataClass objSt = new dataClass(); 
     Method m = dataClass.class 
       .getDeclaredMethod("getList", (Class<?>) null); 
     return (String) m.invoke(objSt, (Object) null); 
    } 
} 

class dataClass { 
    public String getList() { 
     return "hai,"; 
    } 
} 

测试

public class Test { 

    public static void main(String[] args) throws SecurityException, 
      IllegalArgumentException, NoSuchMethodException, 
      IllegalAccessException, InvocationTargetException { 
     myClass m = new myClass(); 
     System.out.println(m.doprocess()); 
    } 

} 
1

您当前的代码无法编译,因为你doprocess方法声明为返回一个int但你的方法体返回Method对象。

要使用反射调用该方法,请使用invoke

尝试这种情况:

class myClass { 
    public Method doprocess() { 
     dataClass objSt = new dataClass(); 
     Class newCls = objSt.getClass(); 
     Method[] methods = newCls.getMethods(); 
     for (Method method : methods) { 
      System.out.println(method.getName()); 
      if (method.getName() == "getList") { 
       return method; 
      } 

     } 
     return null; 
    } 

    public static void main(String[] args) { 
     try { 
      Method m = new myClass().doprocess(); 
      if(m != null) System.out.println(m.invoke(new dataClass())); 
     } catch (IllegalAccessException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalArgumentException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

class dataClass { 
    public String getList() { 
     return "hai,"; 
    } 
}