Java 如何使用反射设置数组
我有一个班,里面有像这样的二传手和传手Java 如何使用反射设置数组,java,reflection,Java,Reflection,我有一个班,里面有像这样的二传手和传手 private String[] message; public String[] getMessage() { return message; } public void setMessage(String[] message) { this.message = message; } 现在我尝试使用反射调用setter,比如 private static String[] getMessageArray(int traineeInd
private String[] message;
public String[] getMessage() {
return message;
}
public void setMessage(String[] message) {
this.message = message;
}
现在我尝试使用反射调用setter,比如
private static String[] getMessageArray(int traineeIndex) {
....
String[] messageArray = new String[nodesLength];
for (int i = 0; i < nodesLength; i++) {
...
messageArray[i] = nodeValue;
}
return messageArray;
} //end of getMessageArray()
private static void doProcessedStuff() {
...
for (int i=1; i<=count ; i++) {
Object myClassInstance = dynamicClassLoading(packageName, className);
...
String[] messageArray = getMessageArray(i);
printXpathResult(myClassInstance, result, messageArray);
}
} //end of doProcessedStuff()
public static void printXpathResult(Object myClassInstance, Object result, String[] messageArray){
...
String methodName = methodPrefix + nodeName; //setMessage
invokeMethodDynamically(myClass, myClassInstance, methodName, null, messageArray);
} //end of printXpathResult()
private static void invokeMethodDynamically(Class<?> myClass, Object myClassInstance, String methodName,
String methodParameter, String[] messageArray) {
...
if (messageArray != null) {
myMethod = myClass.getMethod(methodName, new Class[] { Array.class });
String returnValue = (String) myMethod.invoke(myClassInstance, messageArray);
} else {
myMethod = myClass.getMethod(methodName, new Class[] { String.class });
String returnValue = (String) myMethod.invoke(myClassInstance, new String(methodParameter));
}
} //end of invokeMethodDynamically().
我得到以下错误
java.lang.NoSuchMethodException:
pk.training.basitMahmood.ParsingXmlUsingXpath.ResponseTrainee.
setMessage(java.lang.reflect.Array)
at java.lang.Class.getMethod(Class.java:1607)
at pk.training.basitMahmood.ParsingXmlUsingXpath.TryXpath.
invokeMethodDynamically(TryXpath.java:498)
...
我做错了什么
谢谢请在出现错误的行中尝试以下内容:
myMethod = myClass.getMethod(methodName, new Class[] { String[].class });
您应该替换:
myMethod = myClass.getMethod(methodName, new Class[] { Array.class });
借
在调用invoke方法之前,可能需要将数组引用强制转换为Object。 请参见下面的示例
public class ReflectionTest {
public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
String [] data = {"mango", "apple"};
Method method = Dummy.class.getMethod("setMessage", new Class[] { String[].class });
Dummy dummy = new Dummy();
method.invoke(dummy,(Object)data);
for(String mesg : dummy.getMessage()){
System.out.println(mesg);
}
}
static class Dummy {
private String [] message;
public String[] getMessage() {
return message;
}
public void setMessage(String[] message) {
this.message = message;
}
}
}
这是因为invoke方法将varargs作为参数,它本质上是一个数组。所以现在,如果您将数组作为引用传递,它会认为您传递的是array.length参数数。这就是错误的论点例外。因此,您可能需要在对象REF之前将其转换为一个单独的参数,您检查过这个吗?谢谢但现在当我谈到第行时,
stringreturnvalue=(String)myMethod.invoke(myClassInstance,messageArray)
我得到了java.lang.IllegalArgumentException:参数数目错误
。为什么我会得到这个例外。我有两个长度的消息数组(messageArray
)。第二行中的Thanksnow尝试字符串returnValue=(字符串)myMethod.invoke(myClassInstance,(Object)messageArray)
myMethod = myClass.getMethod(methodName, new Class[] { String[].class });
public class ReflectionTest {
public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
String [] data = {"mango", "apple"};
Method method = Dummy.class.getMethod("setMessage", new Class[] { String[].class });
Dummy dummy = new Dummy();
method.invoke(dummy,(Object)data);
for(String mesg : dummy.getMessage()){
System.out.println(mesg);
}
}
static class Dummy {
private String [] message;
public String[] getMessage() {
return message;
}
public void setMessage(String[] message) {
this.message = message;
}
}
}