1.编写MyPropertyDescriptor,即模拟内省类
package com.ykp.property;
import java.beans.IntrospectionException;
import java.lang.reflect.Method;
/**
* 模拟内省的工作原理
*
* @author燕鲲鹏
* @version 1.0 2012-8-22
*/
publicclass MyPropertyDescriptor {
/**
* 演示内省的工作原理,即如何设置属性的值的 1.传入一个属性名name以及javabean的字节码获得一个PropertyDescriptor对象
* 2.用该对象通过内省里边的一个getWriteMethod获得setName方法 3.用获得的方法通过反射执行该方法,从而设置属性的值
*/
// 属性名
private String propertyName;
// javabean的类字节码
private Class<?>beanClass;
/**
* 构造方法
*
* @param string
* @param class1
*/
publicMyPropertyDescriptor(String propertyName, Class<?>beanClass)
throwsIntrospectionException {
this.propertyName = propertyName;
this.beanClass = beanClass;
}
/**
* 通过getWriteMethod方法获得method对象
*/
public Method getWriteMethod() throws Exception {
// 获得属性的首字母并且转换成大写
charfirstChara = this.propertyName.toUpperCase().charAt(0);
System.err.println("firstChara-->" + firstChara);
// 获得属性的非首字母
String end = this.propertyName.substring(1);
// 通过字符串拼接组成setXxx方法名
String methodName = "set" + firstChara + end;
System.err.println("methodName-->" + methodName);
// 通过函数名利用反射获得该属性的setXxx方法对象
Method m = this.beanClass.getMethod(methodName,
this.propertyName.getClass());
return m;
}
/**
* 通过getWriteMethod方法获得method对象
*/
public Method getReadMethod() throws Exception {
// 获得属性的首字母并且转换成大写
charfirstChara = this.propertyName.toUpperCase().charAt(0);
System.err.println("firstChara-->" + firstChara);
// 获得属性的非首字母
String end = this.propertyName.substring(1);
// 通过字符串拼接组成setXxx方法名
String methodName = "get" + firstChara + end;
System.err.println("methodName-->" + methodName);
// 通过函数名利用反射获得该属性的setXxx方法对象
Method m = this.beanClass.getMethod(methodName);
return m;
}
/**
* 测试
*/
publicstaticvoid main(String[] args) {
String name = "name";
charfirstChara = name.toUpperCase().charAt(0);
System.err.println("firstChara-->" + firstChara);
String end = name.substring(1);
String methodName = "set" + firstChara + end;
System.err.println("methodName-->" + methodName);
try {
MyPropertyDescriptormpd = newMyPropertyDescriptor("name",
User.class);
Method m = mpd.getWriteMethod();
System.err.println("m-->" + m);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.用模拟的内省类来设置属性值
packagecom.ykp.property;
importjava.lang.reflect.Method;
importorg.junit.Test;
/**
* 使用模拟的内省类进行属性的设置和获得
*
* @author燕鲲鹏
* @version 1.0 2012-8-22
*/
publicclassTestMyPropertyDescriptor {
/**
* 通过模拟的内省类来设置user内的属性值
*/
@Test
publicvoidsetProperty() {
try {
// 定义一个User对象
User user = newUser();
System.err.println("设置之前的user-->" + user);
// 获得一个MyPropertyDescriptor
MyPropertyDescriptorpd_id = newMyPropertyDescriptor("id", User.class);
// 获得指定属性name在其类里边的set方法
Method m_id = pd_id.getWriteMethod();
System.err.println("m_id-->"+m_id);
// 通过反射来设置属性name的值
m_id.invoke(user, "1");
// 获得一个MyPropertyDescriptor
MyPropertyDescriptorpd_name = newMyPropertyDescriptor("name", User.class);
// 获得指定属性name在其类里边的set方法
Method m_name = pd_name.getWriteMethod();
System.err.println("m_name-->"+m_name);
// 通过反射来设置属性name的值
m_name.invoke(user, "燕鲲鹏");
// 获得一个MyPropertyDescriptor
MyPropertyDescriptorpd_pwd = newMyPropertyDescriptor("pwd", user.getClass());
// 获得指定属性pwd在其类里边的set方法
Method m_pwd = pd_pwd.getWriteMethod();
System.err.println("m_pwd-->"+m_pwd);
// 通过反射来设置属性pwd的值
m_pwd.invoke(user, "ykp");
// 输出uesr对象,测试是否设置成功
System.err.println("设置之后的user-->" + user);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 通过模拟的内省类来获得user内的属性值
*/
@Test
publicvoidgetProperty() {
try {
// 定义一个User对象
User user = newUser();
//设置user对象的属性值
user.setId("2");
user.setName("燕鲲鹏");
user.setPwd("zss");
System.err.println("设置的user-->" + user);
// 获得一个MyPropertyDescriptor
MyPropertyDescriptorpd_id = newMyPropertyDescriptor("id", User.class);
// 获得指定属性name在其类里边的get方法
Method m_id = pd_id.getReadMethod();
System.err.println("m_id-->"+m_id);
// 通过反射来获得属性name的值
String id= (String) m_id.invoke(user);
// 获得一个MyPropertyDescriptor
MyPropertyDescriptorpd_name = newMyPropertyDescriptor("name", User.class);
// 获得指定属性name在其类里边的get方法
Method m_name = pd_name.getReadMethod();
System.err.println("m_name-->"+m_name);
// 通过反射来获得属性name的值
String name = (String) m_name.invoke(user);
// 获得一个MyPropertyDescriptor
MyPropertyDescriptorpd_pwd = newMyPropertyDescriptor("pwd", user.getClass());
// 获得指定属性pwd在其类里边的get方法
Method m_pwd = pd_pwd.getReadMethod();
System.err.println("m_pwd-->"+m_pwd);
// 通过反射来获得属性pwd的值
String pwd = (String) m_pwd.invoke(user);
// 输出uesr对象,测试是否获得成功
System.err.println("获得的user-->" + "id=="+id+",name=="+name+",pwd=="+pwd);
} catch (Exception e) {
e.printStackTrace();
}
}
}