我有输入:"ListClients param1 param2"
它按" "
分为"ListClients", "param1", "param2";
我想从ListClients调用一个静态方法。
所以它会ListClients.someMethodThatTakesPraams(param1, param2);
有没有办法在java中做到这一点?
答案 0 :(得分:5)
Class.getDeclaredMethod
查找给定名称和参数类型的Method
对象。例如,要查找someMethodThatTakesParams
方法,您可以编写
Method m = ListClients.class.getDeclaredMethod("someMethodThatTakesParams", ArgType1.class, ArgType2.class);
此处,ArgType1
和ArgType2
是参数的类型。
获得方法后,可以按如下方式调用它:
m.invoke(null, arg1, arg2);
arg1
和arg2
是您要传递的参数。请注意,invoke
的第一个参数是null
,因为该方法是静态的。
这种方法省略了你必须捕获的异常以及你可能必须获得的安全权限的各种怪异,但幸运的是,这些并不难以接受。
答案 1 :(得分:3)
是的,你可以使用反射。以下是例如创建新实例
Class<Object> fc = Class.forName("ListClients");
Object myObj = fc.newInstance();
的一些示例
答案 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将成为你的朋友。