我在java中使用Method.Invoke来动态调用另一个类中的方法。唯一的问题是,如果方法有参数,我需要在 class.getDeclaredMethod("method", Something.class) 中启动它,否则它不会看到这些方法。问题是我不知道调用方法时参数是什么。我该如何解决这个问题?
我也在 C# 中完成了此操作,它很简单,不需要我声明参数,但这是在 Java 中完成的。
这是执行调用的代码:
public void DoCommand(String msg){
System.out.println(msg);
String[] temp = msg.split(" ");
String command = temp[0];
Class c = commander.getClass();
try {
Object obj = c.newInstance();
try {
System.out.println("'" + command + "'");
Method method = c.getDeclaredMethod(command);
Object[] pars = new Object[temp.length];
for(int i = 0; i < pars.length; i++){
pars[i] = temp[i + 1];
}
if((String)pars[pars.length - 1] == null){
pars[pars.length - 1] = socket;
}
Parameter[] paramaters = method.getParameters();
Object[] endParameters = AltimitConverter.ConvertParameters(pars, paramaters);
try {
method.invoke(obj, endParameters);
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {}
}catch (NoSuchMethodException e){
System.out.println(e.toString());
}
}catch (Exception e){
System.out.println(e.toString());
}
}
那么如何在获取方法时不声明参数的情况下调用不同参数的不同方法呢?
这是可以运行的 C# 版本:
private static void DoCommand(string msg, Socket soc){
string[] temp = msg.Split (' ');
string command = temp [0];
Type type = commandObject.GetType ();
MethodBase commandFunction = type.GetMethod (command);
if (commandFunction != null) {
object[] pars = new object[temp.Length - 1];
for (int i = 0; i < pars.Length; i++) {
pars [i] = temp [i + 1];
}
if ((string)pars [pars.Length - 1] == "") {
pars [pars.Length - 1] = soc;
}
ParameterInfo[] paramaters = commandFunction.GetParameters ();
object[] endParamaters = AltimitConverter.ConvertParams (pars, paramaters);
if (commandFunction != null) {
try {
commandFunction.Invoke (commandObject, endParamaters);
} catch (Exception e) {
Debug.Log (e);
}
} else {
Debug.Log ("commandFunction is null");
}
}
}
最佳答案
java.lang.reflect.Method
的实例反射(reflect)特定的方法。每一个都与特定的类相关联,具有特定的参数列表,并且具有特定的返回类型。当方法重载发生时,每个重载的方法将由一个不同的 Method
对象反射(reflect);这些是不可互换的。
如果您需要考虑在重载方法中进行选择,那么您只能引用预期参数的数量和类型来执行此操作。如果您必须依赖参数本身来确定匹配的参数类型,那么您就会看到重复的 Java 方法解析逻辑,这很复杂。
如果您只需要担心查找主题类本身声明的非重载方法(即不是继承的),那么您可以在 Class 上调用
对象并扫描 getDeclaredMethods()
Method
对象的结果数组,以查找具有正确名称的对象。
如果不同的重载通过不同数量的参数来区分,或者如果您需要考虑的参数类型模式有特定的限制,那么您可以在保持理智的同时深入了解重载方法,但此时您确实应该问自己是否有更好的方法。这种设计绝对是自找麻烦。
关于java - Method.Invoke 不知道参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33289875/