import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class Test5 
{
public static void main(String[] args)
{
String[] printObj = new String[]{"a","b","c"};
A a = new A();
a.test(printObj);  //第一次调用test
a.test("d","e","f"); //第二次调用test
try {
Method testMethod = a.getClass().getDeclaredMethod("test", String[].class);
testMethod.invoke(a, printObj); //第三次调用test
testMethod.invoke(a, "d", "e", "f"); //第四次调用test
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}class A
{
void test(String... printObj)
{
for(String x : printObj)
{
System.out.println(x);
}

}
}
总共调用4次test方法,前2次没问题,第三次改为testMethod.invoke(a, (Object)printObj); 就OK了,为什么?
第四次如何改才能正确调用test

解决方案 »

  1.   

    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    public class Test5 
    {
        public static void main(String[] args)
        {
            String[] printObj = new String[]{"a","b","c"};
            A a = new A();
            a.test(printObj);  //第一次调用test
            a.test("d","e","f"); //第二次调用test
            
            try {
                Method testMethod = a.getClass().getDeclaredMethod("test", String[].class);
               testMethod.invoke(a, new Object[] {printObj}); //第三次调用test
                testMethod.invoke(a, new Object[] {new String[] {"d", "e", "f"}}); //第四次调用test
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }class A
    {
        void test(String ...printObj)
        {
            for(String x : printObj)
            {
                System.out.println(x);
            }
        }
    }
      

  2.   

    嗯,这样确实OK了,但是不知道为什么这样就OK,能不能帮详细解释下,谢谢了。
      

  3.   

    关键是这个new Object[]
    别人要这个,你不给,当然不给你干活。
      

  4.   


    A.java代码添加test2方法
    class A
    {
    void test2(String str) {
    System.out.println(str);
    }

        void test(String ...printObj)
        {
            for(String x : printObj)
            {
                System.out.println(x);
            }
        }
    }反射调用test2如下:
     Method testMethod = a.getClass().getDeclaredMethod("test2", String.class);
     testMethod.invoke(a, new Object[] {"rvalue"});
    invoke第一参数是调用方法的对象。第二参数就是可变参数,参数个数是一个。new Object[]{}
    具体的值放在数组里。同理你写的test方法也要满足这个规则。Good Luck