0

基本上是在尝试制作 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 基本上是一个字符串数组,它以标记化的形式保存用户输入。意味着新位置的空白区域旁边的任何东西。

4

2 回答 2

2

非常适合在 java 中创建对象;构造函数及其参数是必需的。您可以有一个通用框架,它将接受来自命令提示符的输入并解释它们意味着找出输入的数据类型,例如:数字/字符串/字符/布尔等。您的框架也应该知道参数索引,例如说一个构造函数有 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)

{ 类[] 参数类型 = 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); 
               }
           }
       }

   }

}

希望对你有帮助 !!

于 2013-03-04T20:43:14.190 回答
1

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

于 2013-03-04T20:11:43.480 回答