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

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


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)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 网站防止攻击

    网站防止攻击1、什么是XSSXSS又叫CSS(CrossSiteScript),跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。跨站脚本攻击最大的魅力是通过HTML注入劫持用户的浏览器,任意构造用户当前浏览的HTM

    2022年7月20日
  • Neokylin-Server离线环境、跨主机、使用Docker部署PXC集群

    Neokylin-Server离线环境、跨主机、使用Docker部署PXC集群Neokylin-Server离线环境、跨主机、使用Docker部署PXC集群Neokylin-Server离线环境、跨主机、使用Docker部署PXC集群一、说明二、部署过程:1.切换root账号或所有语句加sudo;2.关闭6个节点防火墙(或打开端口);3.6个节点导入rpm包后安装基础环境:4.设置所有节点;5.启动docker并导入images;6.时间同步;7.etcd集群配置;8.部署flannel网络;9.n1-n3部署pxc;10.m1-m3部署Haproxy+Keepa

    2022年8月10日
  • spidermonkey对比v8_the monkey trial

    spidermonkey对比v8_the monkey trialJavaScript在浏览器中的应用几乎是尽人皆知的。实际上,JavaScript技术也可以使用在非浏览器应用程序当中,从而让应用程序具有自动的脚本功能。本文介绍了一种功能非常强大的JavaScript引擎SpiderMonkey。这个引擎是Mozilla 浏览器的 JavaScript引擎。该引擎接口定义清晰,模块化好。本文简要介绍了 SpiderMonkey的基本结构,并讲解了如何在自己的应用

    2022年10月9日
  • UNet详解(附图文和代码实现)

    卷积神经网络被大规模的应用在分类任务中,输出的结果是整个图像的类标签。但是UNet是像素级分类,输出的则是每个像素点的类别,且不同类别的像素会显示不同颜色,UNet常常用在生物医学图像上,而该任务中图片数据往往较少。所以,Ciresan等人训练了一个卷积神经网络,用滑动窗口提供像素的周围区域(patch)作为输入来预测每个像素的类标签。这个网络有两个优点:(1)输出结果可以定位出目标类别的位置;(2)由于输入的训练数据是patches,这样就相当于进行了数据增强,从而解决了生物医学图像数量少的问题。但是,

    2022年4月4日
  • c语言实现香农编码和译码_香农编码码长

    c语言实现香农编码和译码_香农编码码长1、设计思想     为了设计的方便,我们需要在这个程序里设计一个结构体,以用来存储信源符号、信源符号概率等参数,将每一组参数看成一个结构体来看待,这样我们就可以随时地调用。2、设计流程     主函数部分,我们先接收要输入的信源符号个数,再接收每个信源符号的名称以及他的概率。    主函数设计好后,我们将各功能的函数分成几个模块来写,第一个是排序函数,如果你坚持从大到小输入则可以不用写;第二个…

    2022年9月11日
  • Android 【实现自动轮询的RecycleView】

    Android 【实现自动轮询的RecycleView】

    2021年3月12日

发表回复

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

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