博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java的内省机制
阅读量:4299 次
发布时间:2019-05-27

本文共 2740 字,大约阅读时间需要 9 分钟。

内省(Introspector)是Java语言对JavaBean类属性、事件的一种缺省处理方法。JavaBean是一种特殊的类,遵守JavaBean的规范,即提供默认构造方法,同时所有的属性都是私有的,且每个属性都有公开的读取和设定的方法(gettersetter),这些方法都遵守命名的规范。例如类Person中有属性name,可以通过getName/setName来得到其值或者设置新的值。

Person类:

package com.sigalhu;public class Person {
private String name; private String sex; private int age; public Person() { this.name = "SigalHu"; this.sex = "男"; this.age = 26; } public Person(String name, String sex, int age) { this.name = name; this.sex = sex; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void setSex(String sex) { this.sex = sex; } public String getSex() { return sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{" + "name=" + name + ", sex=" + sex + ", age=" + age + '}'; }}

首先通过Introspector类来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器PropertyDescriptor,通过PropertyDescriptor就可以获取某个属性对应的getter/setter方法,因此就可以通过反射机制来调用这些方法。此外,还可以通过构造方法直接创建PropertyDescriptor对象来对某个对象的属性进行相应操作。

PropertyDescriptor类的主要方法有:

* getPropertyType():获得属性的Class对象;
* getReadMethod():获得用于读取属性值的方法;
* getWriteMethod():获得用于写入属性值的方法;
* hashCode():获取对象的哈希值;
* setReadMethod(Method readMethod):设置用于读取属性值的方法;
* setWriteMethod(Method writeMethod):设置用于写入属性值的方法。

Main类:

package com.sigalhu;import java.beans.BeanInfo;import java.beans.Introspector;import java.beans.PropertyDescriptor;public class Main {
static public void main(String[] args) throws Exception{ Person person = new Person("a","男",25); //如果不想把父类的属性也列出来的话,getBeanInfo的第二个参数填写父类的信息 BeanInfo beanInfo = Introspector.getBeanInfo(Person.class, Object.class); //读取所有属性值 PropertyDescriptor[] props = beanInfo.getPropertyDescriptors(); for(PropertyDescriptor prop:props){ System.out.println(prop.getName() + ": " + prop.getReadMethod().invoke(person)); } System.out.println(); //写入指定属性值 PropertyDescriptor propName = new PropertyDescriptor("name",Person.class); propName.getWriteMethod().invoke(person,"b"); System.out.println(person); System.out.println(); //设置用于写入属性值的方法 PropertyDescriptor propSex = new PropertyDescriptor("sex",Person.class); propName.setWriteMethod(propSex.getWriteMethod()); propName.getWriteMethod().invoke(person,"c"); System.out.println(person); }}

运行结果:

age: 25name: asex: 男Person{name=b, sex=男, age=25}Person{name=b, sex=c, age=25}

参考链接

转载地址:http://ghsws.baihongyu.com/

你可能感兴趣的文章
我们一起做一个可以商用的springboot脚手架
查看>>
idea在搭建ssm框架时mybatis整合问题 无法找到mapper
查看>>
java设计基本原则----单一职责原则
查看>>
HashMap的实现
查看>>
互斥锁 synchronized分析
查看>>
java等待-通知机制 synchronized和waity()的使用实践
查看>>
win10 Docke安装mysql8.0
查看>>
docker 启动已经停止的容器
查看>>
order by 排序原理及性能优化
查看>>
Lock重入锁
查看>>
docker安装 rabbitMq
查看>>
git 常用命令 入门
查看>>
linux安装docker
查看>>
关闭selinx nginx无法使用代理
查看>>
shell 脚本部署项目
查看>>
spring cloud zuul网关上传大文件
查看>>
springboot+mybatis日志显示SQL
查看>>
工作流中文乱码问题解决
查看>>
maven打包本地依赖包
查看>>
spring boot jpa 实现拦截器
查看>>