我输入:"ListClients param1 param2"
其将通过" "
到"ListClients", "param1", "param2";
Java:有没有办法将文本转换为类?
,我想打电话从ListClients一个静态方法。
所以会做ListClients.someMethodThatTakesPraams(param1, param2);
是有办法做到这一点在Java中?
我输入:"ListClients param1 param2"
其将通过" "
到"ListClients", "param1", "param2";
Java:有没有办法将文本转换为类?
,我想打电话从ListClients一个静态方法。
所以会做ListClients.someMethodThatTakesPraams(param1, param2);
是有办法做到这一点在Java中?
是一些例子!您可以使用Class.getDeclaredMethod
查找给定名称和参数类型的Method
对象。例如,要找到你someMethodThatTakesParams
方法,你可以写
Method m = ListClients.class.getDeclaredMethod("someMethodThatTakesParams", ArgType1.class, ArgType2.class);
这里,ArgType1
和ArgType2
是参数类型。
一旦你的方法,你可以按照以下方式调用它:
m.invoke(null, arg1, arg2);
凡arg1
和arg2
是要传递的参数。请注意0的第一个参数是null
,因为该方法是静态的。
这种方法省略了各种奇怪的事情,除了必须捕获的异常以及可能需要获得的安全权限之外,幸运的是这些异常并不难。
Reflection将成为你的朋友。
+1因为我认为这篇文章不值得赞赏。尽管简单地发布教程链接并且没有任何解释肯定不是最有用的东西。 – 2011-01-19 00:41:43
@Tim Bender我同意这一点,但是有些东西你可以放心使用,而不必真正了解它们,并且如果你不了解它们的话,你可以使用你的代码。反思绝对属于第二类。此外,我认为OP会发现整个概念的名称有用。) – biziclop 2011-01-19 01:32:34
是的,你可以使用反射。以下是例如创建一个新的实例
Class<Object> fc = Class.forName("ListClients");
Object myObj = fc.newInstance();
这里确实是invoking methods
我认为如果必须使用反射,这是一个更清晰的答案。 – trillions 2012-10-18 18:02:44
简单的硬编码的方式是创建一个的if/else链和调用正确的方法:
String input = "ListClients param1 param2";
String [] args = input.split(" ");
switch(args.length) {
case 0:
return ListClients.someMethod();
case 1:
return ListClients.someMethod(args[0]);
case 2:
return LIstClients.someMethod(args[1]);
default:
return // something default
}
虽然这看起来有点有古老,它是非常安全的,因为你的程序到底如何你代码应该被调用。
另一种解决方案将涉及使用反射为他人提及:
String input = "ListClients param1 param2";
String [] args = input.split(" ");
Class[] types = new Classs[ args.length ];
Object[] values = new Object[ args.lenght ];
for(int i = 0 ; i < types.lenght ; i++) {
types[i] = String.class;
values [i] = args[i];
}
ListClients.class
.getDeclaredMethod("someMethod", types)
.invoke(null, values);
所有这些由数反映的包围检查的异常。
你应该考虑如何动态需要自己的应用程序,和/如果你会做些什么来防止这样的野生电话:“System.exit(0)”调用或任何其他种类的code injection。
'魔术'....有趣的标签选择。 :D – 2011-01-18 22:58:43
我删除了魔术标记,因为它不适用 – 2011-01-19 00:36:08