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


相关推荐

  • OpenBmc开发8:devtool简介与使用

    OpenBmc开发8:devtool简介与使用1简介devtool是yocto中的一个工具,此命令行工具作为可扩展SDK(eSDK)的一部分,是基础组件。可以使用devtool来帮助构建,测试和打包eSDK中的软件。可以使用该工具有选择地将构建的内容集成到OpenEmbedded构建系统构建的映像中。一般我们使用该工具主要用于修改源码,在修改后将提交加入到指定的layer中。2命令介绍常用的命令是:Add添加recipesModify提取源码Up…

    2022年10月5日
  • idea mac激活码【2021免费激活】[通俗易懂]

    (idea mac激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWN…

    2022年3月21日
  • java递归和迭代的区别

    java递归和迭代的区别出现栈的溢出.而迭代不会!  递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合.使用递归要注意的有两点:1)递归就是在过程或函数里面调用自身;2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口. 递归分为两个阶段:1)递推:把复杂的问题的求解推到比原问

    2022年5月5日
  • ‘utf-8’ codec can’t decode byte 0xff in position 0: invalid start byte[通俗易懂]

    ‘utf-8’ codec can’t decode byte 0xff in position 0: invalid start byte[通俗易懂]‘utf-8’codeccan’tdecodebyte0xffinposition0:invalidstartbyte觉得有用的话,欢迎一起讨论相互学习~FollowMe今天使用语句image_raw_data_jpg=tf.gfile.FastGFile(‘../test_images/test_1.jpg’,’r’).read()读取图片文件的时候遇到了以下问题:’

    2022年6月16日
  • Python 求圆的面积[通俗易懂]

    Python 求圆的面积[通俗易懂]r=int(input(‘输入半径值:’))area=3.1415*r*rprint(area)#保留小数点后两位print(‘{:.2f}’.format(area))“`

    2022年10月22日
  • 模拟电子线路复习笔记( 六) —— 集成运算放大器原理及其运用「建议收藏」

    模拟电子线路复习笔记( 六) —— 集成运算放大器原理及其运用「建议收藏」模拟电子线路复习笔记(六)——集成运算放大器原理及其运用本文是对模电的第六章的集成运算放大器原理及其运用知识点的笔记总结。全文手写,附有例题解析,帮助加深理解。1.知识点总结2.习题解析…

    2022年6月8日

发表回复

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

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