在java中使用用户输入进行反射过程

时间:2013-03-04 19:54:19

标签: 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数组,它以标记化的形式保持用户输入。将白色空间旁边的任何内容表示为新位置。

2 个答案:

答案 0 :(得分:2)

在java中创建对象;构造函数和它的参数是必需的。 您可以拥有一个通用框架,它将接受来自命令提示符的输入并解释它们意味着找出输入ex:number / string / char / boolean等的数据类型。 你的框架也应该知道参数索引,比如说构造函数有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)

{            Class [] 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); 
               }
           }
       }

   }

}

希望这会对你有所帮助!!

答案 1 :(得分:1)

您可能想要使用Interpreter设计模式。它仅用于此。
Interpreter有点复杂,但会确保您的代码解释正常。此外,它还可以轻松包含新命令 看看这里:http://en.wikipedia.org/wiki/Interpreter_pattern
希望我能提供帮助。