2011-01-18 134 views
3

我输入:"ListClients param1 param2" 其将通过" ""ListClients", "param1", "param2";Java:有没有办法将文本转换为类?

,我想打电话从ListClients一个静态方法。

所以会做ListClients.someMethodThatTakesPraams(param1, param2);

是有办法做到这一点在Java中?

+2

'魔术'....有趣的标签选择。 :D – 2011-01-18 22:58:43

+1

我删除了魔术标记,因为它不适用 – 2011-01-19 00:36:08

回答

5

是一些例子!您可以使用Class.getDeclaredMethod查找给定名称和参数类型的Method对象。例如,要找到你someMethodThatTakesParams方法,你可以写

Method m = ListClients.class.getDeclaredMethod("someMethodThatTakesParams", ArgType1.class, ArgType2.class); 

这里,ArgType1ArgType2是参数类型。

一旦你的方法,你可以按照以下方式调用它:

m.invoke(null, arg1, arg2); 

arg1arg2是要传递的参数。请注意0​​的第一个参数是null,因为该方法是静态的。

这种方法省略了各种奇怪的事情,除了必须捕获的异常以及可能需要获得的安全权限之外,幸运的是这些异常并不难。

-1

Reflection将成为你的朋友。

+0

+1因为我认为这篇文章不值得赞赏。尽管简单地发布教程链接并且没有任何解释肯定不是最有用的东西。 – 2011-01-19 00:41:43

+0

@Tim Bender我同意这一点,但是有些东西你可以放心使用,而不必真正了解它们,并且如果你不了解它们的话,你可以使用你的代码。反思绝对属于第二类。此外,我认为OP会发现整个概念的名称有用。) – biziclop 2011-01-19 01:32:34

3

是的,你可以使用反射。以下是例如创建一个新的实例

Class<Object> fc = Class.forName("ListClients"); 
    Object myObj = fc.newInstance(); 

这里确实是invoking methods

+0

我认为如果必须使用反射,这是一个更清晰的答案。 – trillions 2012-10-18 18:02:44

2

简单的硬编码的方式是创建一个的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

相关问题