如果参数类型未知,则通过变量调用带有参数的方法
Call a method with arguments by a variable if argument type is unknown
如果参数数量和参数类型已知,我可以通过变量名调用带有参数的方法,但是如果参数和参数类型仅在搜索时已知,则如何获取声明的方法[搜索方法]。
public static void invokeMethod (String myClass,
String myMethod,
Class[] params, Object[] args)
throws Exception {
Class c = Class.forName(myClass);
Method m = c.getDeclaredMethod(myMethod, params);
Object i = c.newInstance();
Object r = m.invoke(i, args);
}
invokeMethod("myLib", "sampleMethod", new Class[] {String.class, String.class},
new Object[]
{new String("Hello"), new String("World")});
如果我不知道 Class[]
的数量和类型怎么办?如何动态管理这个?我将通过命令行或套接字获取参数和方法。所以我不知道哪个方法会收到。
编辑-
我试过下面的东西-
Class[] css = new Class[10] ;
Object[] obj = new Object[10];
int argLn = params.length;
if (argLn > 1) {
func = params[0].trim();
for (int Idx = 1; Idx < argLn; ++Idx) {
arg.add(params[Idx]);
try {
Integer.parseInt((params[Idx]));
css[Idx-1] = String.class;
} catch (NumberFormatException ne) {
css[Idx-1] = int.class;
}
}
但以例外结束- NoSuchMethodException
。
Oracle 教程网站对此进行了处理 - 请参阅有关反射的一般教程的 "Obtaining Method Type Information" 部分。
总而言之 - 在您致电后
Method m = c.getDeclaredMethod(myMethod, params);
你需要这样的东西:
Class<?>[] pType = m.getParameterTypes();
and/or(取决于您的方法是否可能在其参数类型中使用泛型)
Type[] gpType = m.getGenericParameterTypes();
返回数组的长度将为您提供参数的数量、成员的 class 或类型。您可以将 pType
数组直接传递给您的 invokeMethod()
方法
如果参数数量和参数类型已知,我可以通过变量名调用带有参数的方法,但是如果参数和参数类型仅在搜索时已知,则如何获取声明的方法[搜索方法]。
public static void invokeMethod (String myClass,
String myMethod,
Class[] params, Object[] args)
throws Exception {
Class c = Class.forName(myClass);
Method m = c.getDeclaredMethod(myMethod, params);
Object i = c.newInstance();
Object r = m.invoke(i, args);
}
invokeMethod("myLib", "sampleMethod", new Class[] {String.class, String.class},
new Object[]
{new String("Hello"), new String("World")});
如果我不知道 Class[]
的数量和类型怎么办?如何动态管理这个?我将通过命令行或套接字获取参数和方法。所以我不知道哪个方法会收到。
编辑- 我试过下面的东西-
Class[] css = new Class[10] ;
Object[] obj = new Object[10];
int argLn = params.length;
if (argLn > 1) {
func = params[0].trim();
for (int Idx = 1; Idx < argLn; ++Idx) {
arg.add(params[Idx]);
try {
Integer.parseInt((params[Idx]));
css[Idx-1] = String.class;
} catch (NumberFormatException ne) {
css[Idx-1] = int.class;
}
}
但以例外结束- NoSuchMethodException
。
Oracle 教程网站对此进行了处理 - 请参阅有关反射的一般教程的 "Obtaining Method Type Information" 部分。
总而言之 - 在您致电后
Method m = c.getDeclaredMethod(myMethod, params);
你需要这样的东西:
Class<?>[] pType = m.getParameterTypes();
and/or(取决于您的方法是否可能在其参数类型中使用泛型)
Type[] gpType = m.getGenericParameterTypes();
返回数组的长度将为您提供参数的数量、成员的 class 或类型。您可以将 pType
数组直接传递给您的 invokeMethod()
方法