2013-03-04 40 views
0

基本上我試圖使java命令提示符。假設用戶從用戶輸入:在java中使用用戶輸入進行反射的過程

new x java.util.ArrayList 

這裏x是對象名稱,java.util.ArrayList是類。所以這個由用戶輸入的腳本意味着創建一個類java.util.ArrayList的對象。

現在假設用戶輸入:

new x java.util.ArrayList int:5 

手段創建java.util.ArrayList的對象x,並使其大小5.喜歡我想要的是,每次我輸入的東西相關的對象創建輸入我應該能夠根據用戶的輸入創建類的對象和方法。對Java很新,反思很熱心幫助!這是我認爲到目前爲止使用我的腦海代碼:

public static void token_classification() throws ClassNotFoundException 
    { 
     my_hash = new HashMap(); 
     Keep_Obj_Info = new HashMap(); 
     if(expression_keeper[0].equalsIgnoreCase("new")) 
     { 
      my_hash.put("Object", expression_keeper[1]); 
      Class Obj= Class.forName(expression_keeper[2]); 
      Keep_Obj_Info.put("Modifier", Obj.getModifiers()); 
      Keep_Obj_Info.put("Package",Obj.getPackage()); 
       ////???? 


      Constructor[] constructors = Obj.getConstructors(); 

     } 
     else 
     if(expression_keeper[0].equalsIgnoreCase("call")) 
     { 

     } 
     else 
     if(expression_keeper[0].equalsIgnoreCase("print")) 
     { 

     } 
     else 
     { 
      System.out.println("Invalid Script!"); 
     } 
    } 

ExpressionKeeper基本上是一個String數組,保持在標記化形式的用戶輸入。意味着白色空間旁邊的任何地方到新的位置。

+0

問題是什麼? – 2013-03-04 20:08:40

+0

先生現在的問題是,我將如何操作在表達式守護程序數組中標記的命令如何製作大小爲5的類數組的對象x。那就是問題所在。我想實現一個普通的情況下不是這個具體的:) – Alfred 2013-03-04 20:11:28

回答

2

很好,用於在java中創建對象;構造函數和它的參數是必需的。 你可以有一個通用的框架,它將接受來自命令提示符的輸入並解釋它們意味着找出輸入ex的數據類型:number/string/char/boolean等。 另外你的框架應該知道參數index例如say一個構造函數有2個參數,一個是字符串,另一個是int。並說第一個參數是int,第二個參數是String,當從命令行傳遞參數時,用戶首先傳遞字符串,然後在該場景中int,那麼程序應該足夠聰明,以便按順序妥善安排它們。很多這樣的事情你需要照顧....現在來談談你爲ArrayList提到的例子,你可以編寫一個程序如下:(我剛剛給你一個僞代碼,你可以實現你自己的方式)

{

  int howManyParametersFromCommandLine = getnoParameterCount; //it will maintain no.of parameters passed from command line 

      String[] parametersFromCommandLine = getParametersFromcommandLine(); // Ex : {1,"ABC",new Double(80.0d)}; 

      List<Class> parameterTypesList = parseParameters(parametersFromCommandLine); //This will identify type of each of the parameter 


    Class clazz = Class.forName("youClassName"); 

    Constructor[] cons = clazz.getConstructors(); 

    for(Constructor c : cons) 

{ 類[] parameterTypes = c.getParameterTypes();

 if(parameterTypes.length == howManyParametersFromCommandLine) 

     { 
      //try to match the parameter type in parameterTypesList with parameterTypes if this matches then 

      boolean typeMatchingAndSequecneSucess = matchParameters(parameterTypes,parameterTypesList); 

      if(typeMatchingAndSequecneSucess) 
      { 
       if(c.isAccessible()) 
       { 
        Object[] initargs = parseAndRetActualParamValue(parametersFromCommandLine); 
        return c.newInstance(initargs); 
       } 
      } 
     } 

    } 

}

希望這將幫助你!

+0

會在這行if(parameterTypes.length == howManyParametersFromCommandLine)檢查哪個構造函數的參數匹配用戶輸入的參數組合? 解釋這一點。謝謝! – Alfred 2013-03-04 21:09:57

+0

不,如果(parameterTypes.length == howManyParametersFromCommandLine)只檢查從命令行傳遞的參數數量等於當前構造函數接受的參數數量。看到代碼有一個循環遍歷屬於你的類的構造函數的數組。如果構造函數的參數和沒有。從命令行傳遞的參數匹配它進一步處理以檢查數據類型和參數序列是否匹配。 – Gourabp 2013-03-05 15:24:15

1

您可能想要使用Interpreter設計模式。它僅用於此目的。
Interpreter有點複雜,但會確保你的代碼解釋工作正確。此外,它還可以輕鬆包含新命令。
看看這裏:http://en.wikipedia.org/wiki/Interpreter_pattern
希望我能幫上忙。

+0

我特別談論我的情況。忘記解釋器模式。即時設計我自己的模式:P大聲笑 – Alfred 2013-03-04 20:17:33

+1

那麼,你嘗試使用'Obj.newInstance()'?這樣你可以實例化一個新的對象(默認構造函數)。如果你想確定參數,在你的'構造函數'數組中找到一個具有相應參數的構造函數(使用'constructors [i])。getParameterTypes()'獲取參數類型),然後執行'constructors [i] .newInstance(params)'來使用這個構造函數創建一個對象。 – 2013-03-04 20:25:16

+0

可以請你解釋一下。我會很感激先生。你明白我想要做什麼!編輯你的ans請:)謝謝! – Alfred 2013-03-04 20:36:09