invoke问题,调用时总说java.lang.IllegalArgumentException: object is not an instance of declaring class

lhzongji 2004-11-17 11:57:25
为了省事,我用反射功能循环一个类的所有set方法,给每个类中的属性赋值。但得到set方法后用invoke后出现java.lang.IllegalArgumentException: object is not an instance of declaring class


例如类Atest中有一个方法
public void settestStr(java.lang.String str) {
this.testStr = str;
}

我在类Btest中让类Atest的这个方法invoke。
Class[] c=new Class[1];
c[0]="".getClass();
java.lang.reflect.Method m=Atest.getClass().getDeclaredMethod("settestStr",c);
Object b=m.invoke("test",null);//这里出错



错误堆栈:
java.lang.IllegalArgumentException: object is not an instance of declaring class

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)


at java.lang.reflect.Method.invoke(Method.java:324)


请问这是为什么?
...全文
5104 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
treeroot 2004-11-17
  • 打赏
  • 举报
回复
Class[] c=new Class[1];
c[0]="".getClass(); //这种写法太不可思议了
//上面两句相当于
Class[] param=new Class[]{String.class};

java.lang.reflect.Method m=Atest.getClass().getDeclaredMethod("settestStr",c);
//这句怎么编译过的??

Method m=(Atestc.class).getMethod("settestStr",c);

Object b=m.invoke("test",null);//这里出错,这句怎么看都不顺眼

Object result=m.invoke(new Atest(),param);
第一个参数说明要在哪个实例调用该方法,第二个参数是该方法的参数列表
catblue 2004-11-17
  • 打赏
  • 举报
回复
Atest a = new Atest();
Class ca = a.getClass();
Method method_n = ca .getDeclaredMethod("settestStr",class_n);//第二个参数是这个方法的返回类型你自己去写吧
最后才
method_n.invoke(a,ss);
第二个参数是你要传的参数
treeroot 2004-11-17
  • 打赏
  • 举报
回复
我实在看不下去了,这样用反射!!!!!!!!!!!
class ATest
String testStr;
public void settestStr(java.lang.String str) {
this.testStr = str;
}
public static void main(String[] args){
String[] param=new String[]{"testStr"}; //这个是要设置的字符串
Atest a=new Atest();
java.lang.reflect.Method m=(Atest.class).getMethod("settestStr",new Class[]{String.class});
Object b=m.invoke(a,param);
System.out.println(a.testStr);
}
}
lhzongji 2004-11-17
  • 打赏
  • 举报
回复
treeroot(根根) 晕,你怎么是个只打雷不下雨的主儿啊。
catblue 2004-11-17
  • 打赏
  • 举报
回复
Object b=m.invoke("test",null);//这里出错
错误有二
1。test 你是不是已经new出来了。
2。即使你前面都对了,m.invoke("test",null),第二个参数也不是null
因为Atest中有一个方法
public void settestStr(java.lang.String str)你要有一个String 的参数
treeroot 2004-11-17
  • 打赏
  • 举报
回复
错误的地方实在太多了,我不明白你使用前为什么不看看说明
lhzongji 2004-11-17
  • 打赏
  • 举报
回复
那里没有对???
treeroot 2004-11-17
  • 打赏
  • 举报
回复
晕死,你根本就没有用对呀
lhzongji 2004-11-17
  • 打赏
  • 举报
回复
多谢了。结贴
lhzongji 2004-11-17
  • 打赏
  • 举报
回复
原来是我把参数搞混了。

invoke第一个参数不是参数值。

SORRY,大家,我没看好文档。

另:c[0]="".getClass();
我也觉得这种写法很搞笑,但是我起先在JBX里直接用String.class居然死活不让我编译过去,后来一怒只下就这样写了。

java.lang.reflect.Method m=Atest.getClass().getDeclaredMethod("settestStr",c);
为什么不能编译过去?我在JBX编译过N次了。



哎。关键是懒得下载文档,JBX里的帮助文档也给我搞丢了。
xueqs 2004-11-17
  • 打赏
  • 举报
回复
gz

62,614

社区成员

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

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