在这里主要用到了反射技术。用到类如下:
- IntroSpector
- BeanInfo
- PropertyDescriptor
- Method
package com.sunrex.demo02;
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;
import com.sunrex.demo02.bean.ReflectBean;
public class PropertyDescriptorTest {
public static void main(String[] args) throws IntrospectionException, ClassNotFoundException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
ReflectBean rb = new ReflectBean();
String usernameProperty = "username";
String iTextProperty = "iText";
String AspProperty = "Asp";
String CPUProperty = "CPU";
//username
setPropertyValue(rb, usernameProperty, "jianghailiang");
System.out.println("方法一:" + getPropertyValue(rb, usernameProperty));
//iText
setPropertyValue(rb, iTextProperty, "itext pdf");
System.out.println("方法二:" + getPropertyValue2(rb, iTextProperty));
//Asp
setPropertyValue(rb, AspProperty, "web Asp");
System.out.println("方法二:" + getPropertyValue2(rb, AspProperty));
//username
setPropertyValue(rb, CPUProperty, "Computer CPU");
System.out.println("方法一:" + getPropertyValue(rb, CPUProperty));
}
/**
* 为obj对象的属性设置值
* @param obj
* @param propertyName
* @param propertyNameValue
*/
public static void setPropertyValue(Object obj, String propertyName, String propertyNameValue){
try {
PropertyDescriptor pd = new PropertyDescriptor(propertyName, obj.getClass());
Method methodSetter = pd.getWriteMethod();
methodSetter.invoke(obj, propertyNameValue);
} catch (IntrospectionException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 方法一:调用obj对象的getter
*/
public static Object getPropertyValue(Object obj, String propertyName) {
Object objValue = null;
try {
BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
PropertyDescriptor[] props = beanInfo.getPropertyDescriptors();
for(PropertyDescriptor pd : props) {
//如果遍历到得属性名与参数传进来的属性名,相等则返回属性的值
if(pd.getName().equals(propertyName)) {
Method methodGetter = pd.getReadMethod();//获取到getter方法
objValue = methodGetter.invoke(obj);//调用对象obj的getter方法
break;
}
}
} catch (IntrospectionException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return objValue;
}
/**
* 方法二:调用obj对象的getter
* @param obj
* @param propertyName
* @return
*/
public static Object getPropertyValue2(Object obj, String propertyName) {
Object objValue = null;
try {
PropertyDescriptor pd =
new PropertyDescriptor(propertyName, obj.getClass());
Method methodGetter = pd.getReadMethod();
objValue = methodGetter.invoke(obj);
} catch (IntrospectionException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return objValue;
}
}