利用反射调用可变参数函数的问题

wonbucop 2010-07-14 07:19:55

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
...全文
150 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
smileflyer 2010-07-14
  • 打赏
  • 举报
回复

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
zhmt 2010-07-14
  • 打赏
  • 举报
回复
关键是这个new Object[]
别人要这个,你不给,当然不给你干活。
wonbucop 2010-07-14
  • 打赏
  • 举报
回复
嗯,这样确实OK了,但是不知道为什么这样就OK,能不能帮详细解释下,谢谢了。
smileflyer 2010-07-14
  • 打赏
  • 举报
回复
lz看看。
smileflyer 2010-07-14
  • 打赏
  • 举报
回复
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);
}
}
}

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧