2013-03-06 30 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,"; 
    } 
}