JAVA反射机制 通过反射对javabean进行内省操作
bean类
package com.sg.bean;
public class TestBeanReflex {
??? private String x;
??? private String y;
??? public TestBeanReflex(String x, String y) {
??? ??? this.x = x;
??? ??? this.y = y;
??? }
??? public String getX() {
??? ??? return x;
??? }
??? public void setX(String x) {
??? ??? this.x = x;
??? }
??? public String getY() {
??? ??? return y;
??? }
??? public void setY(String y) {
??? ??? this.y = y;
??? }
??? }
?
?
测试类
package com.sg.bean;
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;
public class IntroSpectorTest {
??? public static void main(String[] args) throws Exception {
??? ??? TestBeanReflex tbr = new TestBeanReflex("3", "5");
??? ??? String propertyName = "x";
??? ??? String value = "7";
??? ??? //获取bean的属性值
??? ??? Object obj = getProperty(tbr, propertyName);
??? ??? System.out.println(obj);
??? ??? //可以修改bean属性的值
??? ??? setProperty(tbr, propertyName, value);
??? ??? System.out.println(tbr.getX());
??? ???
??? }
??? private static void setProperty(Object tbr, String propertyName,
??? ??? ??? Object value) throws IntrospectionException, IllegalAccessException,
??? ??? ??? InvocationTargetException {
??? ??? PropertyDescriptor pd = new PropertyDescriptor(propertyName, tbr.getClass());
??? ??? Method method = pd.getWriteMethod();
??? ??? method.invoke(tbr, value);
??? }
??? private static Object getProperty(Object tbr, String propertyName)
??? ??? ??? throws IntrospectionException, IllegalAccessException,
??? ??? ??? InvocationTargetException {
??? ??? /*PropertyDescriptor pd = new PropertyDescriptor(propertyName,
??? ??? ??? ??? tbr.getClass());
??? ??? Method method = pd.getReadMethod();
??? ??? Object obj = method.invoke(tbr);*/
??? ???
??? ??? BeanInfo beanInfo? = Introspector.getBeanInfo(tbr.getClass());
??? ??? //getPropertyDescriptors因为此方法返回的是bean的所有变量
??? ??? PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
??? ??? Object obj? = null;
??? ??? for (PropertyDescriptor pd : pds) {
??? ??? ??? //通过判断可以只获取你想要的
??? ??? ??? if (pd.getName().equals(propertyName)) {
??? ??? ??? ??? Method method = pd.getReadMethod();
??? ??? ??? ??? obj = method.invoke(tbr);
??? ??? ??? ??? break;
??? ??? ??? }
??? ??? }
??? ??? return obj;
??? }
}