3

我有一堂课,里面有像这样的 setter 和 getter

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().

但是当我来排队时

myMethod = myClass.getMethod(methodName, new Class[] { Array.class });

我收到以下错误

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)
...

我做错了什么?

谢谢

4

3 回答 3

1

在您收到错误的行中尝试此操作:

myMethod = myClass.getMethod(methodName, new Class[] { String[].class });
于 2013-07-15T10:28:25.827 回答
1

在调用调用方法之前,您可能需要将 Array 引用转换为 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 个参数。因此错误的参数异常。因此,您可能需要在 Object ref 之前对其进行强制转换,以便将其视为单个参数

于 2013-07-15T10:38:58.690 回答
0

你应该更换:

myMethod = myClass.getMethod(methodName, new Class[] { Array.class });

经过

 myMethod = myClass.getMethod(methodName, new Class[] { String[].class });
于 2013-07-15T10:31:48.597 回答