2012-12-10 70 views
3

目標很簡單,我想創建一個動態加載類,訪問其方法並傳遞參數值並在運行時獲取返回值的方法。JAVA:調用未知對象類方法並傳遞它的參數

類將被稱爲

class MyClass { 

    public String sayHello() { 

     return "Hello"; 
    } 

    public String sayGoodbye() { 

     return "Goodbye"; 
    } 

    public String saySomething(String word){ 
     return word; 
    } 
} 

主類

public class Main { 


    public void loadClass() { 
     try { 

      Class myclass = Class.forName(getClassName()); 

      //Use reflection to list methods and invoke them 
      Method[] methods = myclass.getMethods(); 
      Object object = myclass.newInstance(); 

      for (int i = 0; i < methods.length; i++) { 
       if (methods[i].getName().startsWith("saySome")) { 
        String word = "hello world"; 

        //**TODO CALL OBJECT METHOD AND PASS ITS PARAMETER** 
       } else if (methods[i].getName().startsWith("say")) { 

        //call method 
        System.out.println(methods[i].invoke(object)); 
       } 

      } 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    private String getClassName() { 

     //Do appropriate stuff here to find out the classname 

     return "com.main.MyClass"; 
    } 

    public static void main(String[] args) throws Exception { 

     new Main().loadClass(); 
    } 
} 

我的問題是如何調用方法與參數並傳遞它的價值?也獲得了返回值及其類型。

+0

http://viralpatel.net/blogs/java-dynamic-class-loading-java-reflection-api/ –

+0

'System.out.println(methods [i] .invoke(object,word));' – assylias

回答

3

我認爲你只是缺少事實上,您可以將參數傳遞給invoke,作爲Object[]

Object result = methods[i].invoke(object, new Object[] { word }); 

或使用可變參數,如果你喜歡:(以上兩個調用是等價的)

Object result = methods[i].invoke(object, word); 

有關詳細信息,請參閱Method.invoke的文檔。

+0

就是這樣,是的,我的錯誤..方法[i] .invoke'的第二個參數是用於參數..謝謝喬恩 –

1

簡單地創建的MyClass對象調用這樣

MyClass mc = new MyClass(); 
String word = "hello world"; 
String returnValue = mc.saySomething(word); 
System.out.println(returnValue);//return hello world here 

功能或做

Class myclass = Class.forName(getClassName()); 
Method mth = myclass.getDeclaredMethod(methodName, params); 
Object obj = myclass.newInstance(); 
String result = (String)mth.invoke(obj, args); 
0

嘗試::

Class c = Class.forName(className); 
Method m = c.getDeclaredMethod(methodName, params); 
Object i = c.newInstance(); 
String result = (String)m.invoke(i, args); 
相關問題