Java,使用基于字符串输入的类

时间:2012-03-26 12:26:57

标签: java command-line

我正在使用Java创建一个基于命令行的工具,我想如果我可以接受用户输入并根据用户自动查找所需的功能,我可能会更轻松自我输入

我想做的是,如果用户键入:

  

用户创建新用户

java代码查找名为user的类,然后查找名为create的函数,并输入newUser作为函数的第一个参数。输入命令“User create newUser”的意思是使java代码触发这行代码:

User.create("newUser");

原因是,如果找不到类或函数,则返回错误。

到目前为止,我一直在玩

Class.forName(cmdArg[0])

其中cmdArg [0]是扫描仪给出的第一个单词,通过拆分有空格的位置找到。

无论如何,是否有可能在Java中实现这一目标?任何帮助将不胜感激。


我的解决方案:

好的,我得到了它的工作,我的最终解决方案是duffymo和user978548的答案的组合,我的解决方案看起来像这样:

Class comArgs[] = new Class[1];
comArgs[0] = String.class;

String[] args = new String[1];
args[0] = commandArray[2];

Class.forName("code."+commandArray[0])
    .getDeclaredMethod(commandArray[1], comArgs)
    .invoke(null, args);

这是一个包含异常分配的try / catch,但它可以工作。

我还有一个HashMap,我想接收哪些命令。

args变量可以与被调用方法所需的参数数量一样长。

4 个答案:

答案 0 :(得分:3)

您可以使用java.lang.Class类中内置的功能:

Class.forName(args[0]).newInstance();

让您的用户输入完全解析的类名,您不必担心所有这些恶作剧。无论如何你都需要它们,因为短名称可能不是唯一的。

另一种方法是将您希望用户能够在Map中创建的Class实例放入并让他们输入密钥。

答案 1 :(得分:2)

正如duffymo所说,Class.forName(args[0]).newInstance();为班级,正如Chin Boon所说,你在反思方法中拥有你想要的一切。比如,运行你的方法: Object.class.getMethods()[find your method here].invoke(obj, args)

答案 2 :(得分:1)

您正在寻找的是Java反思。

答案 3 :(得分:0)

duffymo是正确的 - 反思是你正在讨论的问题。

但是,我可能会建议查看Builder / Factory设计模式的组合,使其更好一点,而不是使用反射来尝试找到所需的类/方法(尽管这显然取决于问题的背景)我在这里做了一些假设!)。