我正在使用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
变量可以与被调用方法所需的参数数量一样长。
答案 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设计模式的组合,使其更好一点,而不是使用反射来尝试找到所需的类/方法(尽管这显然取决于问题的背景)我在这里做了一些假设!)。