黑马程序员技术交流社区
标题:
关于反射调用
[打印本页]
作者:
zl78365336
时间:
2013-12-8 15:50
标题:
关于反射调用
本帖最后由 zl78365336 于 2013-12-8 17:16 编辑
使用反射方式调用setName方法对名称进行设置
其中p2这段有什么问题,求指点!
import java.io.Serializable;
import java.lang.reflect.*;
public class Test2 {
public static void main(String[] args) throws Exception {
Class clazz = Person.class;
Constructor con = clazz.getConstructor(String.class,int.class);
Person p1 = (Person)con.newInstance("zz",25);
System.out.println(p1);
Person p2 = (Person)clazz.getConstructor().newInstance(null);
clazz.getMethod("setName", String.class).invoke(p2, "zl");
System.out.println(p2);
Field field = clazz.getDeclaredField("age");
field.setAccessible(true);
if(field.getType()==int.class)
field.set(p2,20);
System.out.println(field.get(p2));
}
}
@SuppressWarnings("serial")
//实现标记接口
class Person implements Serializable {
private String name;
private int age;
public void getName(String name){
this.name = name;
}
public String setName(){
return name;
}
public void getAge(int age){
this.age = age;
}
public int setAge(){
return age;
}
public Person(){}
public Person(String name,int age){
super();
this.name = name;
this.age = age;
}
//覆盖toString()方法
@Override
public String toString(){
return "name: "+this.name+"; age: "+this.age;
}
}
复制代码
作者:
肖川
时间:
2013-12-8 15:57
亲,你的setName() 和getName()方法写错了。晕死
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
复制代码
这样搞,ok!
作者:
几番意难相付
时间:
2013-12-8 16:02
本帖最后由 几番意难相付 于 2013-12-8 16:04 编辑
仔细看看你的代码
set
get完全搞反了
set是设置值
get是获取值
你写的set是获取值
get是设置值
在代码第15行
clazz.getMethod("setName", String.class).invoke(p2, "zl");
serName这个方法本身是不接受传入值的 你利用invoke方法 却给setname传入了两个值 当然出异常了
解决办法 把person中的get和set方法写正确或者把这行代码
clazz.getMethod("setName", String.class).invoke(p2, "zl");
改成
clazz.getMethod("getName", String.class).invoke(p2, "zl");
作者:
Weix1992
时间:
2013-12-8 16:38
我不是已经回答你的问题了吗?怎么又发帖子了
作者:
简★零度
时间:
2013-12-8 18:14
不可以恶意刷分!会扣技术分。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2