下列那个类有获取PropertyDescriptor实例的方法_java获取properties的值

下列那个类有获取PropertyDescriptor实例的方法_java获取properties的值一、软件包java.beans   包含与开发beans有关的类二、PropertyDescriptor  PropertyDescriptor描述JavaBean通过存储器方法导出的一个属性构造方法:PropertyDescriptor(StringpropertyName,Class<?>beanClass)PropertyDe…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一、软件包 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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187334.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java数字取整(向上取整,向下取整,四舍五入)

    java数字取整(向上取整,向下取整,四舍五入)向上取整:Math.ceil(doublea)向下取整:Math.floor(doublea)四舍五入取整:Math.round(doublea)例:Math.ceil(24.2)–>25Math.floor(24.7)–>24Math.round(24.2)–>24Math.round(24.7)–>25

    2022年6月21日
    42
  • 免费的dns_常用的dns有哪些

    免费的dns_常用的dns有哪些国内部分常用免费DNS服务整理(2021-09) 名称 首选地址 备选地址 114DNS 114.114.114.114 114.114.115.115 阿里DNS 223.5.5.5 223.6.6.6 百度DNS 180.76.76.76 ipv6地址:2400:da00::6666 腾讯DNS(DNSPod) 119.29.29.29 119.28.28.28 腾讯DNS(DNSPod) 182.254.

    2025年9月7日
    6
  • 剑指Offer面试题:13.合并两个排序的链表

    一题目:合并两个排序的链表二代码实现将链表换成数组做简单的循环和递归测试(1)循环实现(2)递归实现

    2021年12月19日
    34
  • Java数组元素求和[通俗易懂]

    Java数组元素求和[通俗易懂]今天给大家解析,Java中数组元素求和的过程一听到求和我们应该首先想到,要运用到**+=**publicclassQiuhe{publicstaticvoidmain(String[]args){//定义一个静态初始化int[]arr={1,2,3,4,5,6,7,8,9};//再定义一个数据用来接收最后的和…

    2022年7月16日
    26
  • 单片机c语言循环移位指令,avr单片机中左移位和右移位指令

    单片机c语言循环移位指令,avr单片机中左移位和右移位指令计算机的指令系统是一套控制计算机操作的代码,称之为机器语言。计算机只能识别和执行机器语言的指令。为了便于人们理解、记忆和使用,通常用汇编语言指令来描述计算机的指令系统。汇编语言指令可通过汇编器翻译成计算机能识别的机器语言。AVR单片机指令系统是RISC结构的精简指令集,是一种简明易掌握﹑效率高的指令系统。SL-DIY02-3开发实验器使用AT90S8535单片机,有118条指令,而我们所做的11…

    2022年5月6日
    156
  • docker部署jenkins安装使用教程_docker安装python

    docker部署jenkins安装使用教程_docker安装python前言使用docker安装jenkins环境,jenkins构建的workspace目录默认是在容器里面构建的,如果我们想执行python3的代码,需进容器内部安装python3的环境。进jenki

    2022年7月30日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号