Java中PropertyDescriptor使用以及问题总结

一、软件包 java.beans 

    包含与开发 beans 有关的类

二、PropertyDescriptor

    PropertyDescriptor 描述 Java Bean 通过存储器方法导出的一个属性

构造方法:

PropertyDescriptor(String propertyName, Class<?> beanClass)

PropertyDescriptor(String propertyName, Class<?> beanClass, String readMethodName, String writeMethodName)

PropertyDescriptor(String propertyName, Method readMethod, Method writeMethod)

常用方法:

public class PropertyDescriptor extends FeatureDescriptor 

    //构造方法 


    //通过调用 getFoo 和 setFoo 存取方法,为符合标准 Java 约定的属性构造一个 PropertyDescriptor 

    public PropertyDescriptor(String propertyName, 

                          Class<?> beanClass) 

                  throws IntrospectionException{} 


    //获得属性的 Class 对象 

    public Class<?> getPropertyType(){} 


    //获得应该用于读取属性值的方法 

    public Method getReadMethod(){} 


    //获得应该用于写入属性值的方法 

    public Method getWriteMethod(){} 

    ...

}

使用例子:

public class Price {

    private String mBuyPrice;

    public String getMBuyPrice() {

        return mBuyPrice;

    }

    public void setMBuyPrice(String mBuyPrice) {

        this.mBuyPrice = mBuyPrice;

    }

    @Override

    public String toString() {

        return "Price{" +

                "mBuyPrice='" + mBuyPrice + '\'' +

                '}';

    }

}

测试类:

public class TestPropertyDescriptor {

    public static void main(String[] args) {

        try {

            Class clazz = Class.forName("com.ssm.model.Price");

            Object obj =  clazz.newInstance();

            Field[] fields = clazz.getDeclaredFields();

            //写数据,即获得写方法(setter方法)给属性赋值

            for(Field f : fields){

                PropertyDescriptor pd = new PropertyDescriptor(f.getName(),clazz);

                Method method = pd.getWriteMethod();

                method.invoke(obj,"100元");

            }

            System.out.println(obj.toString());

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

运行结果:

Price{mBuyPrice='100元'}

注意:

Price类中的属性为

private String mBuyPrice;

使用Idea或者Eclipse自动生成getter和setter方法时,会生成如下:

public class Price {

    private String mBuyPrice;

    public String getmBuyPrice() {

        return mBuyPrice;

    }

    public void setmBuyPrice(String mBuyPrice) {

        this.mBuyPrice = mBuyPrice;

    }

    @Override

    public String toString() {

        return "Price{" +

                "mBuyPrice='" + mBuyPrice + '\'' +

                '}';

    }

}

用测试类运行后会报错:

java.beans.IntrospectionException: Method not found: isMBuyPrice

同时Price类必须含有getter和setter方法,否则也会报同样的错误。

JavaBean属性名要求:前两个字母要么都大写,要么都小写

mport java.beans.PropertyDescriptor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

/**

* @author hui

* @description

* @create 2018/8/30 上午11:29

*/

public class PropertyDescriptorUtil {

    public static PropertyDescriptor getPropertyDescriptor(Class clazz, String propertyName) {

        StringBuffer sb = new StringBuffer();//构建一个可变字符串用来构建方法名称

        Method setMethod = null;

        Method getMethod = null;

        PropertyDescriptor pd = null;

        try {

            Field f = clazz.getDeclaredField(propertyName);//根据字段名来获取字段

            if (f != null) {

                //构建方法的后缀

                String methodEnd = propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);

                sb.append("set" + methodEnd);

                //构建set方法

                setMethod = clazz.getDeclaredMethod(sb.toString(), new Class[]{f.getType()});

                sb.delete(0, sb.length());

                sb.append("get" + methodEnd);

                //构建get 方法

                getMethod = clazz.getDeclaredMethod(sb.toString(), new Class[]{});

                //构建一个属性描述器 把对应属性 propertyName 的 get 和 set 方法保存到属性描述器中

                pd = new PropertyDescriptor(propertyName, getMethod, setMethod);

            }

        } catch (Exception ex) {

            ex.printStackTrace();

        }

        return pd;

    }

    public static void setProperty(Object obj, String propertyName, Object value) {

        Class clazz = obj.getClass();//获取对象的类型

        PropertyDescriptor pd = getPropertyDescriptor(clazz, propertyName);//获取 clazz 类型中的 propertyName 的属性描述器

        Method setMethod = pd.getWriteMethod();//从属性描述器中获取 set 方法

        try {

            setMethod.invoke(obj, new Object[]{value});//调用 set 方法将传入的value值保存属性中去

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    public static Object getProperty(Object obj, String propertyName) {

        Class clazz = obj.getClass();//获取对象的类型

        PropertyDescriptor pd = getPropertyDescriptor(clazz, propertyName);//获取 clazz 类型中的 propertyName 的属性描述器

        Method getMethod = pd.getReadMethod();//从属性描述器中获取 get 方法

        Object value = null;

        try {

            value = getMethod.invoke(clazz, new Object[]{});//调用方法获取方法的返回值

        } catch (Exception e) {

            e.printStackTrace();

        }

        return value;

    }


}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容