我有一个输入:"ListClients param1 param2"
,它按照" "
分割成"ListClients", "param1", "param2";
我想要调用ListClients的静态方法。
所以应该这样做:ListClients.someMethodThatTakesPraams(param1, param2);
在Java中有没有一种方法可以实现这个?
我有一个输入:"ListClients param1 param2"
,它按照" "
分割成"ListClients", "param1", "param2";
我想要调用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
是您想要传递的参数。请注意,调用invoke
方法的第一个参数为null
,因为该方法是静态的。
这种方法省略了您需要捕获的异常和可能需要获取的安全权限等各种奇怪的问题,但幸运的是,这些并不难掌握。
您可以使用反射。以下是创建新实例的示例
Class<Object> fc = Class.forName("ListClients");
Object myObj = fc.newInstance();
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 );
反射将成为你的好朋友。