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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王桂丽 中级黑马   /  2012-9-25 22:27  /  1419 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王桂丽 于 2012-9-25 22:57 编辑

import java.lang.reflect.*;
import java.io.*;
import java.beans.PropertyDescriptor;
class IntroSpectTest
{
public static void main(String[] args) throws Exception
{
  //通过反射方式获取
  //获取构造方法
  Constructor constructor=Person.class.getConstructor(String.class,int.class);
  //新建实例对象
  Person p=(Person)constructor.newInstance("zhangsan",23);
  System.out.println(p.getName()+":"+p.getAge());//zhangsan:23
  Field fieldX=p.getClass().getDeclaredField("name");
  fieldX.setAccessible(true);
  System.out.println(fieldX);//private java.lang.String Person.name
  System.out.println(fieldX.get(p));//zhangsan
  //通过JavaBean来操作
  String propertyName="name";
  setProperties(p,"name","zhansan");
  System.out.println(getProperties(p,"name"));
  
}
private static void setProperties(Object p,String propertyName,Object value)throws Exception
{
  //PropertyDescriptor属性描述符,表示一个类,这个方法接收两个参数,一个是属性名,一个是类的字节码
  //得到了javabean的属性
  PropertyDescriptor pd1=new PropertyDescriptor(propertyName,p.getClass());
  //通过属性得到其读取方法
  Method methodSetX=pd1.getWriteMethod();
  //调用该方法invoke(对象,参数)
  methodSetX.invoke(pd1,value);
}
private static Object getProperties(Object p,String propertyName)throws Exception
{
  PropertyDescriptor pd2=new PropertyDescriptor(propertyName,p.getClass());
  Method methodGetX=pd2.getReadMethod();
  //调用该方法invoke(对象,参数),因为get方法不接收参数,参数为空
  Person retVal=methodGetX.invoke(pd2);
  return retVal;
}
}
class Person
{
private String name;
private int age;
public Person(String name,int age)
{
  this.name=name;
  this.age=age;
}
public void setName(String name)
{
  this.name=name;
}
public String getName()
{
  return name;
}
public void setAge(int age)
{
  this.age=age;
}
public int getAge()
{
  return age;
}
}

疑问:运行时出的一点问题,不知道怎么修改。

未命名.jpg (56.75 KB, 下载次数: 24)

未命名.jpg

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
亲,下次贴代码时请用插入代码功能,方便别人复制
回复 使用道具 举报
自己看看出错信息就知道why了
参数传递错误
  1. import java.lang.reflect.*;
  2. import java.io.*;
  3. import java.beans.PropertyDescriptor;

  4. class IntroSpectTest {
  5.         public static void main(String[] args) throws Exception {
  6.                 // 通过反射方式获取
  7.                 // 获取构造方法
  8.                 Constructor constructor = Person.class.getConstructor(String.class,
  9.                                 int.class);
  10.                 // 新建实例对象
  11.                 Person p = (Person) constructor.newInstance("zhangsan", 23);
  12.                 System.out.println(p.getName() + ":" + p.getAge());// zhangsan:23
  13.                 Field fieldX = p.getClass().getDeclaredField("name");
  14.                 fieldX.setAccessible(true);
  15.                 System.out.println(fieldX);// private java.lang.String Person.name
  16.                 System.out.println(fieldX.get(p));// zhangsan
  17.                 // 通过JavaBean来操作
  18.                 String propertyName = "name";
  19.                 setProperties(p, "name", "zhansan");
  20.                 System.out.println(getProperties(p, "name"));

  21.         }

  22.         private static void setProperties(Object p, String propertyName,
  23.                         Object value) throws Exception {
  24.                 // PropertyDescriptor属性描述符,表示一个类,这个方法接收两个参数,一个是属性名,一个是类的字节码
  25.                 // 得到了javabean的属性
  26.                 PropertyDescriptor pd1 = new PropertyDescriptor(propertyName, p
  27.                                 .getClass());
  28.                 // 通过属性得到其读取方法
  29.                 Method methodSetX = pd1.getWriteMethod();
  30.                 // 调用该方法invoke(对象,参数)
  31.                
  32.                 // 这里传参错误,你的参数不上一个类的实例对象
  33.                 methodSetX.invoke(p, value);
  34.         }

  35.         private static Object getProperties(Object p, String propertyName)
  36.                         throws Exception {
  37.                 PropertyDescriptor pd2 = new PropertyDescriptor(propertyName, p
  38.                                 .getClass());
  39.                 Method methodGetX = pd2.getReadMethod();
  40.                 // 调用该方法invoke(对象,参数),因为get方法不接收参数,参数为空
  41.                
  42.                 // 这里传参错误,你的参数不上一个类的实例对象
  43.                 Object retVal = methodGetX.invoke(p);
  44.                 return retVal;
  45.         }
  46. }

  47. class Person {
  48.         private String name;
  49.         private int age;

  50.         public Person(String name, int age) {
  51.                 this.name = name;
  52.                 this.age = age;
  53.         }

  54.         public void setName(String name) {
  55.                 this.name = name;
  56.         }

  57.         public String getName() {
  58.                 return name;
  59.         }

  60.         public void setAge(int age) {
  61.                 this.age = age;
  62.         }

  63.         public int getAge() {
  64.                 return age;
  65.         }
  66. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
36和47行代码是修改的
回复 使用道具 举报
已解决!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马