A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zl78365336 中级黑马   /  2013-12-8 15:50  /  909 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 zl78365336 于 2013-12-8 17:16 编辑

使用反射方式调用setName方法对名称进行设置
其中p2这段有什么问题,求指点!



  1. import java.io.Serializable;
  2. import java.lang.reflect.*;

  3. public class Test2 {
  4.         public static void main(String[] args) throws Exception {
  5.                 Class clazz = Person.class;

  6.                 Constructor con = clazz.getConstructor(String.class,int.class);
  7.                 Person p1 = (Person)con.newInstance("zz",25);
  8.                 System.out.println(p1);
  9.                
  10.                 Person p2 = (Person)clazz.getConstructor().newInstance(null);
  11.                 clazz.getMethod("setName", String.class).invoke(p2, "zl");
  12.                 System.out.println(p2);
  13.                
  14.                 Field field = clazz.getDeclaredField("age");
  15.                 field.setAccessible(true);
  16.                 if(field.getType()==int.class)
  17.                         field.set(p2,20);
  18.                 System.out.println(field.get(p2));
  19.                
  20.         }
  21. }

  22. @SuppressWarnings("serial")
  23. //实现标记接口
  24. class Person implements Serializable {
  25.         private String name;
  26.         private int age;
  27.         
  28.         public void getName(String name){
  29.                 this.name = name;
  30.         }
  31.         public String setName(){
  32.                 return name;
  33.         }
  34.         
  35.         public void getAge(int age){
  36.                 this.age = age;
  37.         }
  38.         public int setAge(){
  39.                 return age;
  40.         }
  41.         public Person(){}
  42.         public Person(String name,int age){
  43.                 super();
  44.                 this.name = name;
  45.                 this.age = age;
  46.         }
  47.         //覆盖toString()方法
  48.         @Override
  49.         public String toString(){
  50.                 return "name: "+this.name+"; age: "+this.age;
  51.         }
  52. }



复制代码

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

4 个回复

倒序浏览
亲,你的setName() 和getName()方法写错了。晕死
  1.         public String getName(){
  2.                 return this.name;
  3.         }
  4.         public void setName(String name){
  5.                this.name = name;
  6.         }
复制代码

这样搞,ok!

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 几番意难相付 于 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");

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
我不是已经回答你的问题了吗?怎么又发帖子了
回复 使用道具 举报
不可以恶意刷分!会扣技术分。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马