Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用反射设置数组_Java_Reflection - Fatal编程技术网

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;
        }
    }
}