黑马程序员技术交流社区
标题:
关于javabean的一点问题
[打印本页]
作者:
王桂丽
时间:
2012-9-25 22:27
标题:
关于javabean的一点问题
本帖最后由 王桂丽 于 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, 下载次数: 18)
下载附件
2012-9-25 22:26 上传
作者:
程振
时间:
2012-9-25 22:35
亲,下次贴代码时请用插入代码功能,方便别人复制
作者:
程振
时间:
2012-9-25 22:47
自己看看出错信息就知道why了
参数传递错误
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(p, value);
}
private static Object getProperties(Object p, String propertyName)
throws Exception {
PropertyDescriptor pd2 = new PropertyDescriptor(propertyName, p
.getClass());
Method methodGetX = pd2.getReadMethod();
// 调用该方法invoke(对象,参数),因为get方法不接收参数,参数为空
// 这里传参错误,你的参数不上一个类的实例对象
Object retVal = methodGetX.invoke(p);
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;
}
}
复制代码
作者:
程振
时间:
2012-9-25 22:47
36和47行代码是修改的
作者:
王桂丽
时间:
2012-9-25 22:56
已解决!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2