Java:有没有办法将文本转换为类?

时间:2011-01-18 22:55:29

标签: java reflection

我有输入:"ListClients param1 param2" 它按" "分为"ListClients", "param1", "param2";

我想从ListClients调用一个静态方法。

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

有没有办法在java中做到这一点?

4 个答案:

答案 0 :(得分:5)

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

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

此处,ArgType1ArgType2是参数的类型。

获得方法后,可以按如下方式调用它:

m.invoke(null, arg1, arg2);

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

这种方法省略了你必须捕获的异常以及你可能必须获得的安全权限的各种怪异,但幸运的是,这些并不难以接受。

答案 1 :(得分:3)

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

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

以下是invoking methods

的一些示例

答案 2 :(得分: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

答案 3 :(得分:-1)

Reflection将成为你的朋友。