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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© NewDemo 中级黑马   /  2014-5-9 13:40  /  1343 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 NewDemo 于 2014-5-9 20:31 编辑

代码如下:会报错,求解是什么原因,如何解决
  1. package com.itheima;

  2. import java.beans.PropertyDescriptor;
  3. import java.lang.reflect.Field;

  4. public class Test5 {

  5.         /**
  6.          * @param args
  7.          * 5、 定义一个标准的JavaBean,名叫Person,包含属性name、age。使用反射的方式创建一个实例、
  8.          * 调用构造函数初始化name
  9.          * 、age,使用反射方式调用setName方法对名称进行设置,不使用setAge方法直接使用反射方式对age赋值。
  10.          */
  11.         public static void main(String[] args) throws Exception{
  12.                 method_0();
  13.         }

  14.         /**
  15.          * 定义方法,使用反射的方式创建一个实例、调用构造函数初始化name、age,
  16.          * 使用反射方式调用setName方法对名称进行设置,不使用setAge方法直接使用反射方式对age赋值。
  17.          */
  18.         public static void method_0() throws Exception{
  19.                 // 反射创建Person的实例
  20.                 Person p1 = (Person)Person.class
  21.                                 .getConstructor(String.class, int.class)
  22.                                 .newInstance("Jack", 20);
  23.                 // 使用反射方式调用setName方法对名称进行设置
  24.                 String propertyNameX = "x";
  25.                 PropertyDescriptor pd = new PropertyDescriptor(propertyNameX,
  26.                                 p1.getClass());
  27.                 pd.getWriteMethod().invoke(p1, "Tracy");
  28.                 System.out.println(p1);
  29.                 //不使用setAge方法直接使用反射方式对age赋值
  30.                 Field fieldAge = p1.getClass().getDeclaredField("age");
  31.                 fieldAge.setAccessible(true);
  32.                 System.out.println(fieldAge.get(p1));
  33.                
  34.         }

  35. }
  36. // 创建Person类
  37. class Person {
  38.         private String name;
  39.         private int age;
  40.         
  41.         Person(String name, int age) {
  42.                 super();
  43.                 this.name = name;
  44.                 this.age = age;
  45.         }
  46.         
  47.         public String getName() {
  48.                 return name;
  49.         }
  50.         
  51.         public void setName(String name) {
  52.                 this.name = name;
  53.         }
  54.         
  55.         public int getAge() {
  56.                 return age;
  57.         }
  58.         
  59.         public void setAge(int age) {
  60.                 this.age = age;
  61.         }
  62.         
  63.         public String toString() {
  64.                 return name + "::" + age;
  65.         }
  66.         
  67. }
复制代码






评分

参与人数 1技术分 +1 收起 理由
张然龙 + 1

查看全部评分

2 个回复

倒序浏览


  1. import java.beans.PropertyDescriptor;
  2. import java.lang.reflect.Field;

  3. public class Test5 {

  4.         /**
  5.          * @param args
  6.          * 5、 定义一个标准的JavaBean,名叫Person,包含属性name、age。使用反射的方式创建一个实例、
  7.          * 调用构造函数初始化name
  8.          * 、age,使用反射方式调用setName方法对名称进行设置,不使用setAge方法直接使用反射方式对age赋值。
  9.          */
  10.         public static void main(String[] args) throws Exception{
  11.                 method_0();
  12.         }

  13.         /**
  14.          * 定义方法,使用反射的方式创建一个实例、调用构造函数初始化name、age,
  15.          * 使用反射方式调用setName方法对名称进行设置,不使用setAge方法直接使用反射方式对age赋值。
  16.          */
  17.         public static void method_0() throws Exception{
  18.                 // 反射创建Person的实例
  19.                 Person p1 = (Person)Person.class
  20.                                 .getConstructor(String.class, int.class)
  21.                                 .newInstance("Jack", 20);
  22.                 // 使用反射方式调用setName方法对名称进行设置
  23.                 String propertyNameX = "name";
  24.                 PropertyDescriptor pd = new PropertyDescriptor(propertyNameX,
  25.                                 p1.getClass());
  26.                 pd.getWriteMethod().invoke(p1, "Tracy");
  27.                 System.out.println(p1);
  28.                 //不使用setAge方法直接使用反射方式对age赋值
  29.                 Field fieldAge = p1.getClass().getDeclaredField("age");
  30.                 fieldAge.setAccessible(true);
  31.                                 fieldAge.set(p1,25);
  32.                 System.out.println(fieldAge.get(p1));
  33.                
  34.         }

  35. }
  36. // 创建Person类
  37. class Person {
  38.         private String name;
  39.         private int age;
  40.         
  41.         public Person(String name, int age) {
  42.                 super();
  43.                 this.name = name;
  44.                 this.age = age;
  45.         }
  46.         
  47.         public String getName() {
  48.                 return name;
  49.         }
  50.         
  51.         public void setName(String name) {
  52.                 this.name = name;
  53.         }
  54.         
  55.         public int getAge() {
  56.                 return age;
  57.         }
  58.         
  59.         public void setAge(int age) {
  60.                 this.age = age;
  61.         }
  62.         
  63.         public String toString() {
  64.                 return name + "::" + age;
  65.         }
  66.         
  67. }
复制代码
帮你改过了!第一个问题是反射只能操作public修饰的成员,所以,你的Person的构造函数加上public就行了
第二个问题是,题目好像是对age赋值啊,我帮你加了一句代码

评分

参与人数 1技术分 +1 收起 理由
张然龙 + 1

查看全部评分

回复 使用道具 举报
原来是这样,学习了,:lol感谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马