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;
    }
    
}

参考:https://blog.csdn.net/zhuqiuhui/article/details/78542049

Java PropertyDescriptor 是一个用于操作 JavaBean 属性的类。它包含了一个属性的 getter 和 setter 方法的信息,可以通过它来获取或设置属性的值。 在 Java ,一个属性可以通过 getter 和 setter 方法来访问和修改。而 PropertyDescriptor 就是用来获取和设置这些方法的。 使用 PropertyDescriptor 的 set 方法可以设置属性的值。通过给定一个目标对象和一个新的值,set 方法会自动查找到该属性对应的 setter 方法,并将新的值传递给它,从而修改属性的值。 以下是一个示例代码,演示了如何使用 PropertyDescriptor 的 set 方法来设置属性值: ``` public class Student { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } } public class Main { public static void main(String[] args) { try { Student student = new Student(); PropertyDescriptor pd = new PropertyDescriptor("name", Student.class); Method setter = pd.getWriteMethod(); setter.invoke(student, "John"); System.out.println(student.getName()); // 输出 "John" } catch (Exception e) { e.printStackTrace(); } } } ``` 在上述代码,通过 PropertyDescriptor 的构造函数指定了目标属性的名称和所属的类。然后通过 getWriteMethod 方法获取到该属性对应的 setter 方法。最后使用 invoke 方法调用 setter 方法,并传入新的属性值。 通过 PropertyDescriptor 的 set 方法,我们可以方便地修改属性的值,而无需自己手动调用 setter 方法。这样可以使代码更加简洁和易于维护。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值