43、java.beans.PropertyDescriptor类

43、java.beans.PropertyDescriptor类一、软件包java.beans    包含与开发beans有关的类,即基于JavaBeansTM架构的组件 二、PropertyDescriptor   PropertyDescriptor描述JavaBean通过一对存储器方法导出的一个属性 publicclassPropertyDescriptorextendsFeature…

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

Jetbrains全系列IDE稳定放心使用

一、软件包 java.beans 

 

    包含与开发 beans 有关的类,即基于 JavaBeansTM 架构的组件

 

二、PropertyDescriptor

 

    PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性

 

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(){}
}

 

三、示例

import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

public class IntrospectorDemo {

	public static void main(String[] args)throws Exception {
		Person p = new Person("李四",20);
		
		String propertyName = "name";
		
		Object obj = getProperty(p,propertyName);
		System.out.println(obj);
		
		Object value = "王武";
		setProperty(p, propertyName, value);
		System.out.println(p.getName());
	}

	private static void setProperty(Object obj,String propertyName,Object value)throws Exception {
		PropertyDescriptor pd = new PropertyDescriptor(propertyName,obj.getClass());
		Method setMethod = pd.getWriteMethod();
		setMethod.invoke(obj, value);
	}

	private static Object getProperty(Object obj,String propertyName) throws Exception {
		PropertyDescriptor pd = new PropertyDescriptor(propertyName,obj.getClass());
		Method getMethod = pd.getReadMethod();
		return getMethod.invoke(obj);
	}
}
class Person
{
	private String name;
	private int age;
	Person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

 

四、JavaBean的复杂内省操作

 

  1. 采用便利BeanInfo的所有属性方式来查找和设置某个Person的name属性
  2. 在程序中把一个类当作JavaBean来看
  3. 就是调用Introspector.getBeanInfo方法
  4. 得到的BeanInfo对象封装了把这个类当作JavaBean看的结果信息
/**
 * Introspector
 * Introspector 类为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法
 * 对于这三种信息,Introspector 将分别分析 bean 的类和超类,寻找显式或隐式信息,使用这些信息构建一个全面描述目标 bean 的 BeanInfo 对象。
 * 如果某个类提供有关其自身的显式 BeanInfo,
 * 则将它添加到从分析所有派生类得到的 BeanInfo 信息中,并将显式信息视为当前类及其基类的确定的信息,无需进一步深入超类链进行分析。
 * 如果没有在某个类上发现显式 BeanInfo,
 * 则使用低层次的反射来研究类的方法,并应用标准设计模式来标识属性存储器、事件源或公共方法。
 * 然后深入分析类的超类,从它那里(可能在超类链的顶部)添加信息。
 */
public class Introspector
{
	//没有构造方法,其余方法均为静态的

	//在 Java Bean 上进行内省,了解其所有属性、公开的方法和事件
	public static BeanInfo getBeanInfo(Class<?> beanClass)
                            throws IntrospectionException{}
}

 

/**
 * BeanInfo
 * 希望提供有关其 bean 的显式信息的 bean 实现者可以提供某个 BeanInfo 类,
 * 该类实现此 BeanInfo 接口并提供有关其 bean 的方法、属性、事件等显式信息。
 */
public interface BeanInfo
{
	//获得 beans PropertyDescriptor
	PropertyDescriptor[] getPropertyDescriptors();

	//获得 beans MethodDescriptor
	MethodDescriptor[] getMethodDescriptors();
}

 

//上述示例,用复杂的内省操作,代码如下
private static Object getProperty(Object obj,String propertyName) throws Exception 
{
	BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
	PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
	Object retVal = null;
	for(PropertyDescriptor pd : pds)
	{
		if(pd.getName().equals(propertyName))
			retVal = pd.getReadMethod().invoke(obj);
	}
	return retVal;
}

 

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

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

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


相关推荐

  • python中astype 存在空值_python-DataFrame.astype()错误参数

    python中astype 存在空值_python-DataFrame.astype()错误参数使用列的字典时,astype引发ValueError.我试图将大DF中的稀疏列的类型转换(从float到int).我的问题是NaN值.即使将errors参数设置为’ignore’,使用列的字典时也不会忽略它们.这是一个玩具示例:t=pd.DataFrame([[1.01,2],[3.01,10],[np.NaN,20]])t.astype({0:int},errors=’ignore’)V…

    2022年5月25日
  • 云数据库专属集群MyBase_QQ群关系数据库

    云数据库专属集群MyBase_QQ群关系数据库HQY腾讯7000WQQ群关系数据库泄漏共24.52G。QQ24.5gb腾讯QQ群关系数据库,不包含密码。只包含个人名字(群备注名字等信息)。如果想在线查询更多qq群数据信息可以查看:一、下载完24.5gQQ数据库后,解压文件下载后不要把文件改名,打开7z,点击其中一个文件,选择合并文件,合并之后再解压,解压出来应该有22个mdf文件,实际大小应该是91.6G还不到92G。想要数据库下载地址…

    2022年9月1日
  • 时间复杂度 计算_一个算法的时间复杂度为

    时间复杂度 计算_一个算法的时间复杂度为时间复杂度分析、计算时间复杂度的速度

    2022年10月28日
  • springboot项目导入idea中如何部署启动_idea怎么导入javaweb项目

    springboot项目导入idea中如何部署启动_idea怎么导入javaweb项目最近公司要求开发工具要用Idea,作为一个eclipse的老员工,记录一下Idea中遇到的坑刚开始用Idea从Git上导入一个项目时,遇到了很多坑,网上有很多方法,我不多做介绍。只说明一下我使用的方法。1.本地新建一个文件夹,从git上导入项目到本地文件夹。(git的相关使用请自行百度,这里只讲Idea的使用方法)2.将这个文件夹直接拖到Idea的启动图标上。或者,从Ide…

    2022年10月10日
  • MySQL 添加索引,删除索引及其用法[通俗易懂]

    MySQL 添加索引,删除索引及其用法[通俗易懂]原文:https://www.cnblogs.com/zz-tt/p/6609828.html一.索引的作用一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。在数据量和访问量不大的情况下,mysql访问是非常快的,是否加索引对访问影响…

    2022年6月2日
  • 简单的TCP客户端发包工具[通俗易懂]

    简单的TCP客户端发包工具[通俗易懂]一、TCP介绍先放这里有时间在写,最近在写DuiLib相关的使用内容,这部分大家凑活着看二、程序截图下载链接链接:https://pan.baidu.com/s/1MzNUzwd7WwBat6vNMcu6Ow密码:ibuv 主要源码://.h//TCPClient.cpp:定义应用程序的类行为。//#include"stdafx.h"#in…

    2022年9月6日

发表回复

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

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