propertydescriptor是用来干什么的_constructor java

propertydescriptor是用来干什么的_constructor java1、PropertyDescriptor简述PropertyDescriptor对象是位于java.beans包下的工具类,顾名思义为属性描述器,通常我们用于通过反射获取对象方法的时候,下面来看一下常用的用法吧!2、PropertyDescriptor用法(1)、给你一个java对象,你如何生成PropertyDescriptor对象呢?通常,我们会用到…

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

Jetbrains全系列IDE稳定放心使用

1、PropertyDescriptor简述

      PropertyDescriptor对象是位于java.beans包下的工具类,顾名思义为属性描述器,通常我们用于通过反射获取对象方法的时候,下面来看一下常用的用法吧!

2、PropertyDescriptor用法

(1)、给你一个java对象,你如何生成PropertyDescriptor对象呢?

        通常,我们会用到PropertyUtilsBean对象(位于java.beans包下),代码如下:student为我们已经获取到的对象,此时获取到studentDescriptors数组,打印下可以看到获取到的对象的相关信息。

        PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean();
        PropertyDescriptor[] studentDescriptors = propertyUtilsBean.getPropertyDescriptors(student);
        System.out.println(“studentDescriptors:”+JSON.toJSONString(studentDescriptors));

这里我们看一下获取到的一个PropertyDescriptor对象的信息

{
	"bound": false,
	"constrained": false,
	"displayName": "id",
	"expert": false,
	"hidden": false,
	"name": "id",
	"preferred": false,
	"propertyType": "java.lang.String",
	"readMethod": {
		"accessible": false,
		"annotatedExceptionTypes": [],
		"annotatedParameterTypes": [],
		"annotatedReceiverType": {
			"annotations": [],
			"declaredAnnotations": [],
			"type": "com.iflytek.zbg.zwfw.bog.situation.common.entity.BaseEntity"
		},
		"annotatedReturnType": {
			"annotations": [],
			"declaredAnnotations": [],
			"type": "java.lang.String"
		},
		"annotations": [],
		"bridge": false,
		"declaringClass": "com.iflytek.zbg.zwfw.bog.situation.common.entity.BaseEntity",
		"default": false,
		"exceptionTypes": [],
		"genericExceptionTypes": [],
		"genericParameterTypes": [],
		"genericReturnType": "java.lang.String",
		"modifiers": 1,
		"name": "getId",
		"parameterAnnotations": [],
		"parameterCount": 0,
		"parameterTypes": [],
		"returnType": "java.lang.String",
		"synthetic": false,
		"typeParameters": [],
		"varArgs": false
	},
	"shortDescription": "id",
	"writeMethod": {
		"accessible": false,
		"annotatedExceptionTypes": [],
		"annotatedParameterTypes": [{
			"annotations": [],
			"declaredAnnotations": [],
			"type": "java.lang.String"
		}],
		"annotatedReceiverType": {
			"annotations": [],
			"declaredAnnotations": [],
			"type": "com.iflytek.zbg.zwfw.bog.situation.common.entity.BaseEntity"
		},
		"annotatedReturnType": {
			"annotations": [],
			"declaredAnnotations": [],
			"type": "void"
		},
		"annotations": [],
		"bridge": false,
		"declaringClass": "com.iflytek.zbg.zwfw.bog.situation.common.entity.BaseEntity",
		"default": false,
		"exceptionTypes": [],
		"genericExceptionTypes": [],
		"genericParameterTypes": ["java.lang.String"],
		"genericReturnType": "void",
		"modifiers": 1,
		"name": "setId",
		"parameterAnnotations": [
			[]
		],
		"parameterCount": 1,
		"parameterTypes": ["java.lang.String"],
		"returnType": "void",
		"synthetic": false,
		"typeParameters": [],
		"varArgs": false
	}
}

以上可以看到我们已经获取到了Student对象的id属性(包含set和get方法)相关的全部信息。

(2)、几个常用的方法

        prop.getName()  获取属性编码

        prop.getReadMethod()  获取get方法

        prop.getWriteMethod()  获取set方法

        prop.getPropertyType()  获取属性的定义类型

(3)、当我们获取到方法了以后,如何获取之前对象这个属性的值呢?

        通过get方法进行对象反射获取到值,代码如下

        Method method = prop.getReadMethod();    //获取到get方法
        Object val = method.invoke(student);            //调用student的get方法获取内容
        System.out.println(“val:”+JSON.toJSONString(val));

(4)、如果需要对student的属性赋值其他的内容,怎么处理?

        获取set方法,首先我们需要确定set方法存在,且赋值的内容存在,代码如下:

        prop.getWriteMethod().invoke(student, val1);  //student调用set方法将val1值设置到prop固定的属性中

3、实战练习,将一个对象属性值复制到另一个对象中。

// 学生1为获取到有数据的对象,学生2为new出来的无值对象
// 这里student1和student2并非要求为同一个对象,属性字段相同即可
public static void copyCommonProperties(Object student1, Object student2) {
		if (student1 == null || student2 == null) {
			return;
		}
		// 获取student1的所有属性及方法
		PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean();
		PropertyDescriptor[] descriptors = propertyUtilsBean.getPropertyDescriptors(student1);

		for (int i = 0; i < descriptors.length; i++) {
		    // 获取某一个属性的全部信息
			PropertyDescriptor propItem = descriptors[i];
			// 过滤setclass/getclass属性
			if ("class".equals(propItem.getName())) {
				continue;
			}
			try {
			    // 通过get方法获取对应属性的值
				Method method = propItem.getReadMethod();
				Object val = method.invoke(student1);
				// 如果是空,不做处理
				if (null == val) {
					continue;
				}
				// 值复制。调用写方法,设置值
				// 获取student2的当前属性propItem.getName()的信息
				PropertyDescriptor prop = propertyUtilsBean.getPropertyDescriptor(student2, propItem.getName());
				if (null != prop && prop.getWriteMethod() != null) {
					prop.getWriteMethod().invoke(student2, val);
				}
			} catch (Exception e) {
				logger.error("复制出错 ,student1 prop : " + propItem.getDisplayName() + " student1 class: " + student1.getClass()
						+ ";student2 type :" + student2.getClass(), e);
			}

		}

	}

学海无涯苦作舟,遇到一个,总结一个吧!以上仅为自己探讨学习的理解,如有问题,欢迎大家的指导!

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

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

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


相关推荐

  • 计算机毕业设计net作业管理系统(系统+数据库+源码+文档)

    计算机毕业设计net作业管理系统(系统+数据库+源码+文档)计算机毕业设计net作业管理系统(系统+数据库+源码+文档)net作业管理系统计算机毕业设计最新计算机专业原创开发毕业设计参考选题都有源码+数据库是近期作品【1】 jsp科技专业师生沟通平台 【2】 ssm电商平台客流统计系统 【3】 JSP物流仓储仓库管理系统的设计与实现sqlserver 【4】 ssm大学生家教管理系统 【5】 ssm图书管理系统 【6】 ssm医院患者管理系统 【7】 班级信息管理系统 【8】

    2022年6月5日
    23
  • 配对t检验的应用条件是什么_配对t检验在实际工作中的应用[通俗易懂]

    配对t检验的应用条件是什么_配对t检验在实际工作中的应用[通俗易懂](r:相关系数)双样本t时用此公式计算标准误:→三、成组t检验:适用于完全随机设计的两均值比较,要求个体之间相互独立,两组资料均服从正态分布且方差齐性,即为标准的双样本t检验。四、我们重点来看一下,配对t检验,配对t检验从设计上分为3种情况,如下:1、自身配对设计:选择K个受试者,分别在甲、乙两个不同的试验条件(即某个因素的两个水平)下,测出每个受试者同一个指标的两个数值,并把它们配成一对。2、同…

    2022年6月19日
    50
  • 运维常识:什么是关系数据库?

    运维常识:什么是关系数据库?关系数据库是最流行和最常用的数字数据库 在本文中 我们将讨论关系数据库 它的工作原理 示例 关系数据库和非关系数据库之间的差异等等 什么是关系数据库 一个关系数据库是基于组织彼此相关的数据点的模型数据的集合 该术语最初由 IBM 研究实验室的英国计算机科学家 EdgarFrank Ted Codd 于 1970 年引入 关系数据库将有价值的信息或数据组织成表格 这些表格可以根据彼此共有的数据链接到其他几个表格 它使用户能够使用单个查询从一个或多个相关表中的数据构建新数据集 关系数据库使用的数据结构

    2025年7月23日
    5
  • Jenkins安装_jenkins sonar

    Jenkins安装_jenkins sonar前言jenkins的环境搭建方法有很多,本篇使用docker快速搭建一个jenkins环境。环境准备:mac/Linuxdockerdocker拉去jenkins镜像先下载jenkins镜

    2022年7月31日
    2
  • 进程间通信方式——共享内存「建议收藏」

    进程间通信方式——共享内存「建议收藏」进程间通信方式共享内存和与共享内存函数详解,以及模拟共享内存实现进程间通信,以及共享内存的优缺点。

    2022年8月31日
    0
  • 中国十佳IT外包企业排行榜「建议收藏」

    中国十佳IT外包企业排行榜「建议收藏」“东软”集团股份有限公司在众多外包厂商还在为利润率达到15%而挣扎时,东软早已轻松迈上了20%的利润率大关。从甲方转向乙方的背景,A股的融资渠道,多年的本土运营关系,都成为助推东软快速成长的有力因素。东软是中国最大的离岸软件外包提供商。作为一家以软件技术为核心的公司,东软通过开放式创新、卓越运营管理、人力资源发展等战略的实施,全面构造公司的核心竞争力,创造客户和社会的价值,从而实现技术的价值。东软…

    2022年4月29日
    389

发表回复

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

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