根据属性名和类Class得到数据
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Introspector的使用
* @author 流浪鱼
*
*/
public class IntrospectorDemo {
/**
* @param args
*/
public static void main(String[] args) throws IllegalArgumentException, IntrospectionException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
UserInfo userInfo=new UserInfo("zhangsan", "123456");
String propertyName="userName";
Object retVal=getProperty(userInfo, propertyName);
System.out.println("retVal="+retVal);//retVal=zhangsan
Object value="abc";
setProperty(userInfo, propertyName, value);
retVal=getProperty(userInfo, propertyName);
System.out.println("retVal="+retVal); //retVal=abc 27
/*使用BeanUtils工具包操作JavaBean org.apache.commons.beanutils.BeanUtils
String userName=BeanUtils.getProperty(userInfo, propertyName);
System.out.println("userName="+userName);
BeanUtils.setProperty(userInfo, propertyName, "linjiqin");
userName=BeanUtils.getProperty(userInfo, propertyName);
System.out.println("userName="+userName);
*/
}
/**
*
* @param clazz
* @param propertyName
* @return
* @throws IntrospectionException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
private static Object getProperty(Object clazz, String propertyName) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
/*方法1
PropertyDescriptor pd=new PropertyDescriptor(propertyName, clazz.getClass());
Method methodGet=pd.getReadMethod();
return methodGet.invoke(clazz);
*/
Object retVal=null;
BeanInfo beanInfo=Introspector.getBeanInfo(clazz.getClass());
PropertyDescriptor[] pds=beanInfo.getPropertyDescriptors();
for(PropertyDescriptor pd:pds){
if(propertyName.equals(pd.getName())){
Method methodGet=pd.getReadMethod();
retVal=methodGet.invoke(clazz);
break;
}
}
return retVal;
}
/**
* 设置属性
*
* @param clazz 对象名
* @param propertyName 属性名
* @param value 属性值
*/
private static void setProperty(Object clazz, String propertyName, Object value)
throws IntrospectionException,IllegalAccessException, InvocationTargetException{
//方法一
/*PropertyDescriptor pd=new PropertyDescriptor(propertyName, clazz.getClass());
Method methodSet=pd.getWriteMethod();
methodSet.invoke(clazz, value);*/
//方法二
BeanInfo beanInfo=Introspector.getBeanInfo(clazz.getClass());
PropertyDescriptor[] pds=beanInfo.getPropertyDescriptors();
for(PropertyDescriptor pd:pds){
if(propertyName.equals(pd.getName())){
Method methodSet=pd.getWriteMethod();
methodSet.invoke(clazz, value);
break;
}
}
}
}
/**
* IntrospectorDemo测试需要的JavaBean
* @author 流浪鱼
*
*/
public class UserInfo {
private String userName;
private String pwd;
public UserInfo(String userName, String pwd) {
super();
this.userName = userName;
this.pwd = pwd;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
本文介绍了一种通过Java反射机制操作JavaBean属性的方法,利用Introspector获取Bean的属性描述符,进而实现对指定属性的读取和修改。该方法适用于需要动态处理对象属性的场景。
846

被折叠的 条评论
为什么被折叠?



