基本上我正在尝试制作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 :(得分: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
希望我能提供帮助。